Próbuję użyć podzapytania w instrukcji IN w Doctrine2.Doctrine 2 limit podzapytania
Oto co kwerenda SQL surowy powinien wyglądać następująco:
SELECT * FROM license
WHERE id
IN (SELECT id
FROM license
WHERE subscription = x
ORDER BY date DESC
LIMIT 5)
ORDER BY name ASC;
Co chcę zrobić jest wyświetlanie ostatnich 5 wyniki zamówionego przez nazwę, więc muszę najpierw zapytać ostatnie 5 wyników, a następnie uporządkuj imię i nazwisko w głównej kwerendzie.
Problem polega na tym, że nie mogę LIMITOWAĆ wewnętrznego zapytania.
Oto mój bieżący kod:
$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();
Jak widać, tworzę moje pierwsze zapytanie, zamawiam i ograniczyć go (za pomocą metody niestandardowej), a następnie próbuję użyć go w drugim zapytaniu.
Jednak wydaje się, że LIMIT nie jest częścią instrukcji DQL, ponieważ gdy I var_dump DQL pierwszego kwerendy, LIMIT jest nieobecny, co oznacza, że jest całkowicie ignorowane, gdy uruchamiam $ qb2-> getQuery() -> getResult();
Zrobiłem to, uruchamiając pierwsze zapytanie i ręcznie wprowadzając wyniki w drugim, ale jest brzydkie.
Każdy pomysł, jak to zrobić właściwie?
Dzięki!
Czy można użyć funkcji setMaxResults QueryBuilder? – Michael
Tak, możesz utworzyć 2 konstruktorów zapytań, jeden dla podselekcji IN i jeden dla globalnego DQL. w pierwszym użyj 'setMaxResults'. – Florian
Wydaje się, że głównym powodem limitu nieuwzględnionego w DQL jest buforowanie - http://www.doctrine-project.org/jira/browse/DDC-885 – gregor