web-dev-qa-db-fra.com

Ordre par plusieurs colonnes avec Doctrine

J'ai besoin de classer les données en deux colonnes (lorsque les lignes ont des valeurs différentes pour la colonne numéro 1, ordre par ordre; sinon, ordre par numéro de colonne 2)

J'utilise un QueryBuilder pour créer la requête.

Si j'appelle la méthode orderBy une seconde fois, elle remplace les commandes précédemment spécifiées.

Je peux passer deux colonnes comme premier paramètre:

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

Mais je ne peux pas passer deux directions pour le second paramètre. Ainsi, lorsque j'exécute cette requête, la première colonne est ordonnée dans une direction ascendante et la seconde dans l'ordre décroissant. Je voudrais utiliser descendant pour les deux.

Est-il possible de faire cela en utilisant QueryBuilder? Dois-je utiliser DQL?

102
zootropo

Vous devez ajouter le sens de la commande juste après le nom de la colonne:

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

Comme vous l'avez noté, plusieurs appels à orderByne pas empiler , mais vous pouvez effectuer plusieurs appels à addOrderBy :

$qb->addOrderBy('column1', 'ASC')
   ->addOrderBy('column2', 'DESC');
194
Diego Agulló

Dans Doctrine 2.x, vous ne pouvez pas passer plusieurs ordres en utilisant doctrine 'orderBy' ou 'addOrderBy', comme dans l'exemple ci-dessus. En effet, il ajoute automatiquement le "ASC" à la fin du nom de la dernière colonne lorsque vous avez laissé le second paramètre vide, comme dans la fonction "orderBy".

Par exemple, ->orderBy('a.fist_name ASC, a.last_name ASC') générera du code SQL du type 'ORDER BY nom_contenant ASC, nom_comme ASC ASC'. Donc, ceci est une erreur de syntaxe SQL. Tout simplement parce que la valeur par défaut de orderBy ou addOrderBy est "ASC".

Pour ajouter plusieurs commandes, vous devez utiliser la fonction 'ajouter'. Et ce sera comme ça.

->add('orderBy','first_name ASC, last_name ASC'). Cela vous donnera le SQL correctement formaté.

Plus d'infos sur la fonction add (). https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

J'espère que cela t'aides. À votre santé!

15
Anjana Silva

vous pouvez utiliser ->addOrderBy($sort, $order)

Ajouter: Doctrine Querybuilder btw. utilise souvent des modifications "spéciales" des méthodes normales, voir select-addSelect, where-andWhere-orWhere, groupBy-addgroupBy...

7
Christian Huber

Le commentaire pour orderBy notes de code source: Keys are field and values are the order, being either ASC or DESC.. Donc, vous pouvez faire orderBy->(['field' => Criteria::ASC]).

1
Victor S