Ordina per più colonne con Doctrine


115

Ho bisogno di ordinare i dati per due colonne (quando le righe hanno valori diversi per la colonna numero 1, ordina in base ad essa; altrimenti, ordina per colonna numero 2)

Sto usando a QueryBuilderper creare la query.

Se chiamo il orderBymetodo una seconda volta, sostituisce qualsiasi ordine specificato in precedenza.

Posso passare due colonne come primo parametro:

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

Ma non posso passare due direzioni di ordinamento per il secondo parametro, quindi quando eseguo questa query la prima colonna è ordinata in senso ascendente e la seconda, discendente. Vorrei usare discendente per entrambi.

C'è un modo per farlo usando QueryBuilder? Devo usare DQL?

Risposte:


213

Devi aggiungere la direzione dell'ordine subito dopo il nome della colonna:

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

Come hai notato, più chiamate a orderBy non si accumulano , ma puoi effettuare più chiamate a addOrderBy:

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

2
Grazie. non l'avevo notato prima. Ho pensato che due dichiarazioni orderBy andassero bene per questo. quindi non ho realizzato il metodo addOrderBy. applausi per averlo fatto notare :)

Diego Agulló: Purtroppo entrambi i link nella tua risposta non funzionano più.
k00ni

1
@ k00ni grazie per averlo fatto notare. Ho aggiornato il primo alla documentazione più recente, ma non sono riuscito a trovare il problema migrato DC-909 su GitHub, quindi ho rimosso il secondo.
Diego Agulló

Per i generatori di query con alias di tabella, non dimenticare di aggiungere alias.column_name.
Maulik Parmar

16

In Doctrine 2.x non è possibile passare più ordini utilizzando doctrine "orderBy" o "addOrderBy" come negli esempi precedenti. Perché, aggiunge automaticamente "ASC" alla fine del nome dell'ultima colonna quando hai lasciato vuoto il secondo parametro, come nella funzione "orderBy".

Ad esempio ->orderBy('a.fist_name ASC, a.last_name ASC'), SQL restituirà qualcosa di simile a "ORDER BY first_name ASC, last_name ASC ASC". Quindi questo è un errore di sintassi SQL. Semplicemente perché il valore predefinito di orderBy o addOrderBy è "ASC".

Per aggiungere più ordini in base a è necessario utilizzare la funzione "aggiungi". E sarà così.

->add('orderBy','first_name ASC, last_name ASC'). Questo ti darà l'SQL formattato correttamente.

Maggiori informazioni sulla funzione add (). https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

Spero che questo ti aiuti. Saluti!


8

Puoi usare ->addOrderBy($sort, $order)

Aggiunto: Doctrine Querybuilder btw. usa spesso "speciali" modifiche dei metodi normali, vedere select-addSelect, where-andWhere-orWhere, groupBy-addgroupBy...


0

Il commento per orderByappunti di codice sorgente: Keys are field and values are the order, being either ASC or DESC.. Quindi puoi farlo orderBy->(['field' => Criteria::ASC]).


Questo non è corretto. Vedi la mia risposta sopra
Thomas Hansen il

0

Il orderBymetodo richiede due stringhe o un Expr\OrderByoggetto. Se vuoi aggiungere più dichiarazioni d'ordine, la cosa corretta è usare il addOrderBymetodo, o istanziare un OrderByoggetto e popolarlo di conseguenza:

   # 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)
   ;
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.