2013-01-09 12 views
13

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!

+0

Czy można użyć funkcji setMaxResults QueryBuilder? – Michael

+1

Tak, możesz utworzyć 2 konstruktorów zapytań, jeden dla podselekcji IN i jeden dla globalnego DQL. w pierwszym użyj 'setMaxResults'. – Florian

+1

Wydaje się, że głównym powodem limitu nieuwzględnionego w DQL jest buforowanie - http://www.doctrine-project.org/jira/browse/DDC-885 – gregor

Odpowiedz

14

Niestety Doctrine nie obsługuje limitu zapytań zagnieżdżonych. Nawet jeśli użyjesz 2 QueryBuilders i setMaxResults() w wewnętrznym QueryBuilderze, będzie to po prostu ignorowane.

Jedynym sposobem, aby to zrobić w tym momencie, jest uruchomienie 2 pojedynczych zapytań.

+1

To naprawdę niefortunne. Przez godzinę przyglądałem się mojemu kodowi, próbując dowiedzieć się, co jest nie tak. Doctrine mogła przynajmniej rzucić wyjątek, mówiąc, że nie jest obsługiwana. – NSAddict

+0

Oznaczenie tego jako odpowiedzi, ponieważ podczas gdy nie pomogło, potwierdziło moje wątpliwości, że nie da się tego zrobić. – Growiel

+0

Tutaj http://stackoverflow.com/questions/24068947/subquery-with-limit-in-doctrine może być rozwiązaniem –