2017-09-25 9 views
0

私はquerybuilderを作成して、1つのリクエストに含めるすべてのエンティティを取得しましたが、最後に26個のSQLリクエストが作成されました。symfony querybuilderとSQLリクエスト番号の増加

これを行う方法はありますか?

ご回答いただきありがとうございます。ここで

は、クエリービルダーである:

$builder = $this->createQueryBuilder("message") 
    ->innerJoin("AppBundle:User", "user", "WITH", "message.sender = user.id") 
    ->innerJoin("AppBundle:Thread", "thread", "WITH", "message.thread = thread.id") 
    ->innerJoin("AppBundle:MessageMetadata", "messageMetadata", "WITH", "messageMetadata.message = message.id AND messageMetadata.participant != user.id") 
; 

$builder = $this->filterSoftdelete($builder, $user); 

if($filters != null) { 
    foreach ($filters as $key => $value) { 
     $builder->andWhere("(message.recipient = :id AND user.firstname LIKE '%". $value ."%') OR 
       (message.recipient = :id AND user.lastname LIKE '%". $value ."%') OR 
       (message.recipient = :id AND thread.subject LIKE '%". $value ."%')") 
      ->setParameter("id", $user->getId());; 
    } 
} else { 
    $builder->andWhere("message.recipient = :id or message.sender = :id") 
     ->setParameter("id", $user->getId()); 
} 

if($ordering != null) { 
    foreach ($ordering as $key => $value) { 
     if($key == "subject") { 
      $builder->addOrderBy("thread.subject", $value); 
     } else if($key == "createdAt") { 
      $builder->addOrderBy("message." . $key, $value); 
     } else { 
      $builder->addOrderBy("messageMetadata.isRead", "desc"); 
     } 
    } 
} else { 
    $builder->addOrderBy("messageMetadata.isRead", "desc"); 
} 

return $this->query($builder); 

答えて

0

あなたのビルダーは、唯一の要求を発射する必要があります。しかし、おそらく、あなたがフェッチされていない属性または結合されたコレクションにアクセスしようとしていて、遅延読み込みが行われ、多くの望ましくない要求が作成されます。通常

コントローラで、あなたのビルダーを使用してエンティティをフェッチ:

$entities = $em->getRepository('myrepo')->myCustomQuery($myparams...); 

を次に(多分小枝で)あなたのエンティティをごループ:

foreach ($entities as $entity) { 
    $entity->getAssociation()->doSomething; // sometime here you forgot to fetch sayed association 
} 

ソリューションで->addSelect()を使用することですクエリビルダは、関連するエンティティの選択とハイドレーションを強制します。

基本的にあなたがやっている

SELECT entity.* FROM entity JOIN other_entity ON ...; 

とDoctrine、必要に応じて不要なクエリの結果として不足しているother_entityをフェッチします。

しかし、あなたがやるべきこと:

SELECT entity.*, other_entity.* FROM entity JOIN other_entity ON ...; 

あなたはあなたの要求を見てsymfonyのツールバーを使用する必要があります。

希望はこのことができます

私はそれは、私のような、別の問題を持っているん
+0

、Entityクラスを待ち、そしてあなたの$ビルダー=の$ this - > createQueryBuilder(「メッセージ」にOtherEntityクラス –

+0

をgived ( "AppBundle:Thread"、 "thread"、 "WITH"、 "WITH"、 "WITH"、 "messageSender = user.id") - > innerJoin messageMes​​sage.message = message.idとmessageMetadata.participant!= user.id ") ;" innerJoin( "AppBundle:MessageMetadata"、 "messageMetadata"、 "WITH"、 "messageMetadata.message = message.idおよびmessageMetadata.participant!あなたは$ builder-> addSelect( 'user')を追加することができます... –

+0

ありがとう、私は試してみてください。この場合、innerjoinはOKですが、私のプロジェクトの他のケースでは、私はleftjoin原因がいくつかのレコードです外部キーはnullです。クエリビルダを使って1回のリクエストでそれを取得する方法はありませんか? –

関連する問題