2012-09-28 12 views
5

Sto provando a creare una query per il recupero di oggetti da un database Doctrine, ordinati per il numero di membri di una specifica relazione uno-a-molti.Come ordinare una query DQL Doctrine in base al numero o ai membri di una relazione?

In particolare: Ho due entità: Persona e Federazione. Una persona può essere membro di una federazione (la persona ha una relazione di "federazione") e una federazione può avere n persone (Federazione come relazione "persone").

Vorrei creare una query DQL che restituisca l'elenco di federazioni, ordinato da quante persone sono membri di tale federazione. Qualcosa in questo senso:

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

Questo sarebbe il primo passo. C'è un ulteriore secondo passo, che non so se è possibile ottenere con una singola query, che sarebbe filtrare i membri della relazione prima del conteggio. In questo modo:

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

Tale seconda sarebbe il risultato ottimale, ma il primo soddisfa le esigenze, se il secondo caso non tenerne in una singola query.

Grazie in anticipo.

risposta

4

Ci sono 5 funzioni di aggregazione in DQL è possibile utilizzare (Dottrina 2.2): AVG, COUNT, MIN, MAX e SUM.

La query seguente dovrebbe funzionare:

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

Per ulteriori DQL inganno vi consiglio di guardare in alto official Doctrine docs.

+2

Grazie per la risposta! Ho dovuto apportare lievi modifiche alla Query, in quanto penso che tu non possa ORDINARE da un aggregato senza SELEZIONARLO. Quindi la query finale è questa: 'SELECT f, COUNT (p) come qtd FROM AcmeStatsBundle: Federation f LEFT JOIN f.people p WHERE p.attr =: some_value GROUP BY f.id ORDER BY qtr' : D –

6

Si potrebbe fare qualcosa sulla falsariga di:

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

La parola chiave NASCOSTO è stato aggiunto in Dottrina 2.2, significa che il campo selezionato non sarà nei risultati, e in questo caso che significa riavvia le tue entità invece di un array.

riferimento alla documentazione DQL SELECT: http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples

+0

Grazie! Questo è il modo per farlo! – Russ

Problemi correlati