2012-07-20 3 views
81

Ich brauche von zwei Spalten Daten zu bestellen (wenn die Reihen unterschiedliche Werte für Spaltennummer 1, um durch sie, andernfalls um durch Spaltennummer 2)Sortieren nach mehreren Spalten mit Lehre

Ich verwende ein QueryBuilder zum Erstellen der Abfrage.

Wenn ich die orderBy Methode ein zweites Mal aufrufen, ersetzt er alle zuvor Ordnungen festgelegt.

kann ich zwei Spalten als ersten Parameter übergeben:

->orderBy('r.firstColumn, r.secondColumn', 'DESC'); 

Aber ich kann nicht zwei Ordnungsrichtungen für den zweiten Parameter übergeben, so dass, wenn ich diese Abfrage ausführen, wird die erste Spalte in aufsteigender Richtung bestellt und die der zweite, absteigend. Ich würde für beide gerne absteigend verwenden.

Gibt es eine Möglichkeit, dies QueryBuilder mit zu tun? Muss ich DQL verwenden?

Antwort

161

Sie haben die Auftragsrichtung direkt nach dem Spaltennamen hinzuzufügen:

$qb->orderBy('column1 ASC, column2 DESC'); 

Wie Sie bemerkt haben, mehrere Anrufe zu orderBydo not stack, aber Sie können mehrere Anrufe zu addOrderBy machen:

$qb->addOrderBy('column1', 'ASC') 
    ->addOrderBy('column2', 'DESC'); 
+0

danke. Ich habe das vorher nicht bemerkt. Ich dachte, dass zwei orderBy-Anweisungen in Ordnung sind. also habe ich die Methode addOrderBy nicht erkannt. Prost für das Aufzeigen :) – Sharpy35

5

können Sie ->addOrderBy($sort, $order) verwenden

Hinzufügen: Doctrine QueryBuilder BTW. oft verwendet „spezielle“ Modifikationen der normalen Methoden findet select-addSelect, where-andWhere-orWhere, groupBy-addgroupBy ...

11

In Lehre 2.x Sie nicht mehr, um durch die Verwendung Lehre ‚orderBy‘ oder ‚addOrderBy‘ wie oben Beispiele passieren kann. Denn am Ende des letzten Spaltennamens fügt sie automatisch den 'ASC' hinzu, wenn Sie den zweiten Parameter leer lassen, z. B. in der Funktion 'orderBy'.

Für ein Beispiel ->orderBy('a.fist_name ASC, a.last_name ASC') wird SQL etwas wie diese ausgeben 'ORDER BY vorname ASC, last_name ASC ASC'. Das ist also ein SQL-Syntaxfehler. Einfach weil der Default von orderBy oder addOrderBy 'ASC' ist.

Um mehrere Reihenfolge von der hinzufügen, die Sie verwenden müssen ‚Hinzufügen‘ Funktion. Und so wird es sein.

->add('orderBy','first_name ASC, last_name ASC'). Dadurch erhalten Sie das korrekt formatierte SQL.

Weitere Informationen über add() Funktion. http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html#_add

Hoffe, das hilft. Prost!