Ordnen Sie mit Doctrine nach mehreren Spalten

115

Ich muss Daten nach zwei Spalten sortieren (wenn die Zeilen unterschiedliche Werte für Spalte 1 haben, sortieren Sie danach; andernfalls sortieren Sie nach Spalte 2).

Ich verwende a QueryBuilder, um die Abfrage zu erstellen.

Wenn ich die orderByMethode ein zweites Mal aufrufe, ersetzt sie alle zuvor angegebenen Ordnungen.

Ich kann zwei Spalten als ersten Parameter übergeben:

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

Ich kann jedoch nicht zwei Ordnungsrichtungen für den zweiten Parameter übergeben. Wenn ich diese Abfrage ausführe, wird die erste Spalte in aufsteigender und die zweite in absteigender Richtung geordnet. Ich würde gerne absteigend für beide verwenden.

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

Zootropo
quelle

Antworten:

213

Sie müssen die Bestellrichtung direkt nach dem Spaltennamen hinzufügen:

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

Wie Sie bereits bemerkt haben, müssen mehrere Anrufe orderBy nicht gestapelt werden. Sie können jedoch mehrere Anrufe tätigen an addOrderBy:

$qb->addOrderBy('column1', 'ASC')
   ->addOrderBy('column2', 'DESC');
Diego Agulló
quelle
2
Vielen Dank. Ich habe das vorher nicht bemerkt. Ich dachte, zwei orderBy-Anweisungen sind dafür in Ordnung. Daher habe ich die addOrderBy-Methode nicht erkannt. Prost für den Hinweis :)
Diego Agulló: Leider funktionieren beide Links in Ihrer Antwort nicht mehr.
k00ni
1
@ k00ni danke für den Hinweis. Ich habe das erstere auf die neuesten Dokumente aktualisiert, aber ich konnte das migrierte Problem DC-909 auf GitHub nicht finden, also habe ich das letztere entfernt.
Diego Agulló
Vergessen Sie bei Abfrageerstellern mit Tabellenalias nicht, diese hinzuzufügen alias.column_name.
Maulik Parmar
16

In Doctrine 2.x können Sie keine Mehrfachreihenfolge übergeben, indem Sie die Doktrin 'orderBy' oder 'addOrderBy' wie in den obigen Beispielen verwenden. Weil es automatisch den 'ASC' am Ende des letzten Spaltennamens hinzufügt, wenn Sie den zweiten Parameter leer gelassen haben, wie in der 'orderBy'-Funktion.

In einem Beispiel ->orderBy('a.fist_name ASC, a.last_name ASC')wird SQL wie folgt ausgegeben: 'ORDER BY first_name ASC, last_name ASC ASC'. Das ist also ein SQL-Syntaxfehler. Einfach, weil der Standardwert von orderBy oder addOrderBy 'ASC' ist.

Um mehrere Bestellungen nach hinzuzufügen, müssen Sie die Funktion "Hinzufügen" verwenden. Und es wird so sein.

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

Weitere Informationen zur Funktion add (). https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

Hoffe das hilft. Prost!

Anjana Silva
quelle
8

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

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

Christian Huber
quelle
0

Der Kommentar für orderByQuellcode-Hinweise : Keys are field and values are the order, being either ASC or DESC.. So können Sie tun orderBy->(['field' => Criteria::ASC]).

Victor S.
quelle
Das ist nicht richtig. Siehe meine Antwort oben
Thomas Hansen
0

Die orderByMethode erfordert entweder zwei Zeichenfolgen oder ein Expr\OrderByObjekt. Wenn Sie mehrere Auftragserklärungen hinzufügen möchten, müssen Sie die addOrderByMethode verwenden oder ein OrderByObjekt instanziieren und entsprechend füllen :

   # Inside a Repository method:
   $myResults = $this->createQueryBuilder('a')
       ->addOrderBy('a.column1', 'ASC')
       ->addOrderBy('a.column2', 'ASC')
       ->addOrderBy('a.column3', 'DESC')
   ;

   # Or, using a OrderBy object:
   $orderBy = new OrderBy('a.column1', 'ASC');
   $orderBy->add('a.column2', 'ASC');
   $orderBy->add('a.column3', 'DESC');

   $myResults = $this->createQueryBuilder('a')
       ->orderBy($orderBy)
   ;
Thomas Hansen
quelle