2012-09-28 3 views
5

Ich versuche eine Abfrage zum Abrufen von Objekten aus einer Doctrine-Datenbank zu erstellen, sortiert nach der Anzahl der Mitglieder einer bestimmten Eins-zu-viele-Beziehung.Wie sortiere ich eine Doctrine DQL-Abfrage nach der Anzahl oder den Mitgliedern einer Relation?

Genauer gesagt: Ich habe zwei Entitäten: Person und Föderation. Eine Person kann Mitglied einer Föderation sein (Person hat eine "Föderation" -Beziehung), und eine Föderation kann n Personen haben (Föderation als "Personen" -Beziehung).

Ich möchte eine DQL-Abfrage erstellen, die die Liste der Föderationen zurückgeben würde, geordnet nach Anzahl der Mitglieder dieser Föderation. Etwas in diese Richtung:

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

Das wäre der erste Schritt. Es gibt einen zusätzlichen zweiten Schritt, von dem ich nicht weiß, ob es möglich ist, mit einer einzelnen Abfrage zu erreichen, die die Mitglieder der Beziehung vor dem Zählen filtern würde. Wie so:

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

Das zweite wäre das optimale Ergebnis, aber die erste erfüllt meine Bedürfnisse, wenn der zweite Fall nicht in einer einzigen Abfrage feasibly.

Vielen Dank im Voraus.

Antwort

4

Es gibt 5 Aggregatfunktionen in DQL können Sie (Lehre 2.2) verwenden: AVG, COUNT, MIN, MAX und SUM.

sollte die folgende Abfrage arbeiten:

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

Weitere DQL Tricks ich Sie official Doctrine docs nachschlagen vorschlagen.

+2

Danke für die Antwort:

Referenz SELECT Dokumentation dql! Ich musste geringfügige Änderungen an der Abfrage vornehmen, da ich denke, dass man ORDER BY nicht durch ein Aggregat sortieren kann, ohne es auszuwählen. Die letzte Abfrage lautet also: 'SELECT f, COUNT (p) als qtd FROM AcmeStatsBundle: Federation f LEFT JOIN f.people p WHERE p.attr =: some_value GROUP BY f.id ORDER BY qtr' : D –

6

Sie etwas tun könnte entlang der Linien von:

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

Das HIDDEN Schlüsselwort hinzugefügt wurde in Lehre 2.2, bedeutet dies, dass das ausgewählte Feld nicht in den Ergebnissen sein, und in diesem Fall, dass bedeutet, dass Sie Holen Sie einfach Ihre Entitäten zurück anstelle eines Arrays. http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples

+0

Danke! So geht es! – Russ

Verwandte Themen