2016-10-20 12 views
1

最初のDQLクエリの結果を(DQLで)クエリする方法が見つかりませんでした。 Doctrine - DQL - クエリ結果をクエリする方法は?

は、私のような最初のDQLクエリがあります。

$query = $this->createQueryBuilder('q') 
$query->[methods()] 
$query->->getQuery()->getResult(); 

をし、このクエリの結果から、私は別のDQLクエリをやりたいです。しかし、getResultメソッドは配列を返します。

最初のクエリの結果に対して別のDQLクエリを実行するのが最適なソリューションです。それにはどんな解決策がありますか?

編集:私はリポジトリファイル( "[Entity] Repository.php")でクエリを実行しています。私の最初のDoctrineクエリから、私は最初の結果を得ることを期待しています。この結果から、別の選択クエリを実行したいと思います。
別の言い方をすれば、私は最初のクエリの結果を 'temporary'の表から別のDoctrineクエリを実行する際にどのように '変換'するのだろうと思います。

答えて

1

別のクエリの結果を使用してクエリを作成する必要がある場合は、サブクエリを使用できます。例:

$qb = $this->createQueryBuilder('qb')->where('r.name = :name')->setParameter('name', $name); 
$qb2 = $this->createQueryBuilder('qb2'); 

$qb->andWhere(
    $qb->expr()->in(
     'r.id', 
     $qb2->select('u.id') 
      ->from('AppBundle:User', 'user') 
      ->getQuery()->getDQL() 
    ) 
); 
+0

この回答ありがとうございます。これは最初の問題には反応しませんでした。結果的に質問を更新しました。 – user6815451

+0

ありがとうございます。これは最初の問題には反応しませんでした。結果的に質問を更新しました。 サブクエリを次のように指定しました: 'テーブル'から '値'を選択して別の選択で '値'を選択します 最初のクエリの結果にselectを実行する方法が不思議です例えば、 – user6815451

+0

あなたはこれに何かしたいですか? SELECT * FROMテーブルWHERE id IN(1、2、3、4); –

0

あなたが思っているとおりに正確に行うことはできません。 Doctrineがすべてのクエリに対してRDBMに一時テーブルやその他のアーティファクトを作成するのは馬鹿げています。

つまり、あなたのユースケースは完全にナットではありません。最初の「ワイド」な結果セットが必要なユースケースを想像して、次にそのより狭いサブセットを想像することができます。私はあなたがこれに近づく可能性が二つの方法を考えることができ

  1. は、道に沿って追加条件を追加し、順番に2つのクエリを実行するために、単一のQueryBuilderインスタンスを活用します。

  2. ArrayCollectionのgetResult()から配列をラップし、criteria APIを使用してコレクションをフィルタします。基準APIは、生のDQLクエリが実行できるすべてを行うことはできませんが、非常に強力です。

私は基準APIから始めます。フィルタリングはメモリ内で行われ、データベースへのもう1回のラウンドトリップを回避し、(さらに重要なことに)一連の水分オーバーヘッドを回避します。

0

DoctrineのDTO機能を使用したいと思うようです。単一のエンティティまたは複数のエンティティから収集されたさまざまな値から構築されたデータ転送オブジェクトを作成できます。 "NEW" Operator Syntax

複数の結果に対して1つの結果のみを取得したいが、複数の結果を繰り返したくない場合は、getOneOrNullResult()メソッドを使用できます。

$query = $this->createQueryBuilder('q'); 
... 
$query->select('NEW MyDTO(q.id, q.name, q1.id)'); 
$dto = $query->->getQuery()->getOneOrNullResult(); 

返されるDTOには、取得したいさまざまなテーブルから取得したプリミティブ値が含まれます。

重要なことは、Doctrine ORMがエンティティを扱うことです。選択されたフィールドがいくつか返されるだけではありません。 partialsを使用して特定のフィールドを選択することはできますが、お勧めできません。DTOの使用は、キャッシュされず、より良い輸送手段を提供するので好ましい。

関連する問題