2012-09-28 21 views
5

Próbuję utworzyć zapytanie do pobierania obiektów z bazy danych Doctrine, posortowane według liczby członków konkretnej relacji jeden do wielu.Jak sortować zapytanie DQL Doctrine według liczby lub członków relacji?

Dokładniej: mam dwie jednostki: osobę i federację. Osoba może być członkiem jednej federacji (Osoba ma relację "federacja"), a federacja może mieć osoby (Federacja jako relacja "ludzie").

Chciałbym utworzyć kwerendę DQL, która zwróci listę federacji, uporządkowaną według liczby osób będących członkami tej federacji. Coś wzdłuż tych linii:

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of members of f.people] 

To byłby pierwszy krok. Jest dodatkowy, drugi krok, którego nie wiem, czy można to osiągnąć za pomocą pojedynczego zapytania, które filtrowałoby członków relacji przed liczeniem. Tak:

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of (f.people p where p.attr = value)] 

To drugi byłby optymalny wynik, ale pierwszy z nich zaspokaja moje potrzeby, jeśli drugi przypadek nie jest na rzeczywiste w jednym zapytaniu.

Z góry dziękuję.

Odpowiedz

4

Istnieje 5 funkcje zagregowane w DQL można użyć (Doktryna 2.2): AVG, COUNT, MIN, MAX i SUM.

Poniższe zapytanie powinno działać:

SELECT f 
FROM AcmeStatsBundle:Federation f 
LEFT JOIN f.people p 
GROUP BY f.id 
ORDER BY COUNT(p) 
WHERE p.attr = :some_value 

Więcej DQL oszustwa Proponuję spojrzeć official Doctrine docs.

+2

Dzięki za odpowiedź! Musiałem wprowadzić drobne zmiany w Kwerendie, ponieważ uważam, że nie można ZAMÓWić przez agregat bez WYBORU. Tak więc ostatnie zapytanie jest następujące: 'SELECT f, COUNT (p) jak qtd Z AcmeStatsBundle: Federacja f LEFT JOIN f. Ludzie p WHERE p.attr =: some_value GROUP BY f.id ORDER BY qtr' : D –

6

Można zrobić coś wzdłuż linii:

public function getFederationsOrderedByNumberOfPeople() 
{ 
    return $this->createQueryBuilder('f') 
     ->addSelect('COUNT(p) AS HIDDEN personCount'); 
     ->leftJoin('f.people', 'p'); 
     ->groupBy('f') 
     ->orderBy('personCount', 'DESC'); 
} 

ukrytej kluczowe dodano w Doctrine 2.2, oznacza to, że wybrana dziedzina nie będzie w wynikach, aw tym przypadku oznacza to, że po prostu odzyskaj swoje jednostki zamiast tablicy.

Odniesienie do DQL SELECT dokumentację: http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples

+0

Dziękujemy! To jest sposób na zrobienie tego! – Russ

Powiązane problemy