2013-01-09 24 views
13

Doctrine2のIN文でサブクエリを使用しようとしています。ここでDoctrine 2 limit 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件の結果を照会してからオーダーする必要がありますメインクエリの名前。

問題は、内部クエリをLIMITできないように見えることです。私が注文し、制限すること(カスタムメソッドを介して)、その後、私は2番目のクエリでそれを使用しようと、あなたが見ることができるように

$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(); 

が、私は私の最初のクエリを作成します。

は、ここに私の現在のコードです。

しかし、LIMITは最初のクエリのDQLをvar_dumpするときにLIMITが存在しないため、$ qb2-> getQuery() - >を実行すると完全に無視されるので、LIMITはDQL文の一部ではないようですgetResult();

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

正しく行う方法はありますか?

ありがとうございます!

+0

QueryBuilderのsetMaxResults関数を使用できますか? – Michael

+1

はい、IN副選択用とグローバルDQL用の2つの問合せビルダーを作成できます。最初のものでは 'setMaxResults'を使います。 – Florian

+1

DQLに含まれていない制限の主な理由はキャッシングだと思われます - http://www.doctrine-project.org/jira/browse/DDC-885 – gregor

答えて

14

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

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

+1

これは本当に残念です。私は、何が間違っているのか把握しようとしている間、自分のコードを見ていました。 Doctrineは少なくともそれがサポートされていないという例外をスローすることができました。 – NSAddict

+0

これは助けにはならないが、それはできないという疑いを確認したので、これを答えにしている。 – Growiel

+0

ここでhttp://stackoverflow.com/questions/24068947/subquery-with-limit-in-doctrineは解決策になる可能性があります –

関連する問題