0

私は Symfony 2 と Doctrine に慣れてきており、結合されたエンティティを水和するために実行される不要なデータベース ルックアップの数に問題があります。

子オブジェクトを使用して結合クエリを実行すると、子オブジェクトはデータベースから他のマッピングを自動的に取得します。プロパティにアクセスしようとしていないにもかかわらず、これを行っています。findクエリ内でアクセスされているかのようです。

私の例は以下のようになります - と呼ばれるエンティティがありPersonBuildingその両方が と呼ばれるエンティティに参加します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 インスタンスに渡すことができるものはありますか?

4

1 に答える 1

-1

fetchマッピングにオプションを追加します。

そのようです:

クラスプレイス{

/**
 * Reverse mapping
 * @var Person
 * 
 * @ORM\OneToOne(targetEntity="Person", mappedBy="Home", fetch="EXTRA_LAZY")
 */   
private $Resident; 

}

于 2012-11-27T13:31:26.867 に答える