121 votes

Ordre par plusieurs colonnes avec Doctrine

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

Je suis à l'aide d'un QueryBuilder pour créer la requête.

Si j'appelle l' orderBy méthode un deuxième temps, il remplace précédemment défini rangements.

Je peux passer deux colonnes en tant que premier paramètre:

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

Mais je ne peux pas passer la commande de deux directions pour le deuxième paramètre, donc quand j'exécute cette requête la première colonne est commandé dans un sens ascendant et le second, dans l'ordre décroissant. Je voudrais utiliser décroissant pour deux d'entre eux.

Est-il un moyen de le faire à l'aide de QueryBuilder? Dois-je utiliser DQL?

235voto

Diego Agulló Points 2705

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é, les appels multiples à orderBy ne se superposent pas , mais vous pouvez effectuer plusieurs appels à addOrderBy :

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

18voto

Anjana Silva Points 391

Dans La Doctrine 2.x vous ne pouvez pas passer plusieurs commande par l'aide de la doctrine 'orderBy' ou 'addOrderBy' comme exemples ci-dessus. Car, il ajoute automatiquement le 'ASC' à la fin de la dernière colonne nom lorsque vous avez quitté le deuxième paramètre vide, comme dans le 'orderBy' fonction.

Pour un exemple ->orderBy('a.fist_name ASC, a.last_name ASC') sera sortie de SQL quelque chose comme ceci 'ORDER BY prenom ASC, last_name ASC ASC'. C'est donc erreur de syntaxe SQL. Tout simplement parce que par défaut de la orderBy ou addOrderBy est 'ASC'.

Pour ajouter plusieurs commande par l', vous devez utiliser l'option "ajouter". Et ce sera comme cela.

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

Plus d'infos sur add() de la fonction. http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html#_add

Espérons que cette aide. Cheers!

9voto

chuber50 Points 264

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 ..

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X