2016-12-28 8 views
0

をフェッチから私はAccountエンティティと1対多の関連性を持っているUser実体を持って防止教義関連企業

$builder = $this->getEntityManager()->createQueryBuilder() 
    ->select('U') 
    ->from('Model:User', 'U') 
    ->leftJoin('U.accounts', 'A') 
; 

しかし、ユーザーのフェッチされたアカウントにアクセスしようとすると、Doctrineが各ユーザーのアカウントを取得するためにデータベースに追加のクエリを行っていることがわかります。

foreach ($users as $user) { 
    foreach ($user->getAccounts() as $account) { 
     // This triggers additional Doctrine query. 
     var_dump($account->getId()); 
    } 
} 

私は、バッチジョブとして、このコードを実行していると私はアカウントでプリロードユーザーが最大限のパフォーマンスを達成するために、後で追加のクエリを発行しないようにしたいです。

Doctrineが追加のクエリを作成する理由とこれを防ぐ方法を教えてください。

私はOneToManyアソシエーションにfetch="EXTRA_LAZY"オプションを使用しようとしましたが、運がなくても結果は同じです。

+0

- > select( 'U、A') – Cerad

答えて

1

あなたはselect文にaccountデータを追加する必要があります。fetch="EXTRA_LAZY"が少ないデータをロードするためのもので、フェッチについて

$builder = $this->getEntityManager()->createQueryBuilder() 
    ->select('U') 
    ->from('Model:User', 'U') 
    ->addSelect('A') 
    ->leftJoin('U.accounts', 'A') 
; 

。関連するエンティティを自動的に読み込むfetch="EAGER"が必要な場合があります。

+0

私の神。あなたはもちろん正しいのです。結局のところ寝なければならないようです... –

+0

Join :: WITHの必要はなく、元のクエリの名前を使用して変更する必要がある部分を示したか、全体のクエリを示した方が良いでしょう。 – Cerad

+0

@セラードありがとう。完全なクエリで更新されました。 – ClickLabs