15

Doctrine2 の IN ステートメントでサブクエリを使用しようとしています。

生の SQL クエリは次のようになります。

SELECT * FROM license 
WHERE id 
IN (SELECT id 
    FROM license 
    WHERE subscription = x 
    ORDER BY date DESC
    LIMIT 5)
ORDER BY name ASC;

私がやりたいのは、名前順に並べられた最後の 5 つの結果を表示することです。そのため、最初に最後の 5 つの結果をクエリしてから、メイン クエリで名前順に並べ替える必要があります。

問題は、内部クエリを制限できないように見えることです。

これが私の現在のコードです:

$qb = $this->createQueryBuilder('l');
$qb->select('l.id');
$qb = $this->whereSubscriptionId($qb, $subscription_id);
$qb = $this->offsetLimitOrder($qb, 0, 5, 'deliveryDatetime desc');

//Second Query, adds the "order by X"
$qb2 = $this->createQueryBuilder('l2');
$qb2->add('where', $qb2->expr()->in('l2.id', $qb->getQuery()->getDQL()));
if(isset($order)){
    $order = explode(' ', $order);
    $qb2->addOrderBy('l2.'.$order[0], $order[1]);
 }

 return $qb2->getQuery()
            ->getResult();

ご覧のとおり、最初のクエリを作成し、(カスタム メソッドを使用して) 並べ替えて制限し、それを 2 番目のクエリで使用しようとしています。

ただし、最初のクエリの DQL を var_dump すると、LIMIT が存在しないため、LIMIT は DQL ステートメントの一部ではないようです。つまり、$qb2->getQuery()->getResult(); を実行すると完全に無視されます。

最初のクエリを起動し、2 番目のクエリに手動で結果を入力することで機能させましたが、醜いです。

適切に行う方法について何か考えはありますか?

ありがとう !

4

1 に答える 1

18

残念ながら、Doctrine はネストされたクエリの制限をサポートしていません。内側の QueryBuilder で 2 つの QueryBuilder と setMaxResults() を使用しても、単純に無視されます。

現時点でこれを行う唯一の方法は、2 つの個別のクエリを実行することです。

于 2014-07-27T04:27:37.293 に答える