私は Symfony 2 と Doctrine に慣れてきており、結合されたエンティティを水和するために実行される不要なデータベース ルックアップの数に問題があります。
子オブジェクトを使用して結合クエリを実行すると、子オブジェクトはデータベースから他のマッピングを自動的に取得します。プロパティにアクセスしようとしていないにもかかわらず、これを行っています。find
クエリ内でアクセスされているかのようです。
私の例は以下のようになります - と呼ばれるエンティティがありPerson
、Building
その両方が と呼ばれるエンティティに参加しますPlace
:
class Person {
/**
* Where this person lives
* @var Place $Home
*
* @ORM\OneToOne(targetEntity="Place", cascade={"persist"}, inversedBy="Resident" )
* @ORM\JoinColumn(name="place_id", referencedColumnName="id")
*/
private $Home;
}
class Building {
/**
* Where this building stands
* @var Place $Site
*
* @ORM\OneToOne(targetEntity="Place", cascade={"persist"}, inversedBy="Landmark" )
* @ORM\JoinColumn(name="place_id", referencedColumnName="id")
*/
private $Site;
}
class Place {
/**
* Reverse mapping
* @var Person $Resident
*
* @ORM\OneToOne(targetEntity="Person", mappedBy="Home")
*/
private $Resident;
/**
* Reverse mapping
* @var Building $Landmark
*
* @ORM\OneToOne(targetEntity="Building", mappedBy="Site")
*/
private $Landmark;
}
私の Person リポジトリの結合は次のようになります。
/**
* @override
* @return Person
*/
public function find( $id ){
$query = $this->getEntityManager()
->createQuery('
SELECT p, h
FROM MyBundle:Person p
JOIN p.Home h
WHERE p.id = :id'
)->setParameter('id', $id);
return $query->getSingleResult();
}
操作中に Place が Building リレーションシップを個別にフェッチしないようにするにはどうすればよいfind
ですか? これを止めるために Query インスタンスに渡すことができるものはありますか?