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?
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 à orderBy
ne pas empiler , mais vous pouvez effectuer plusieurs appels à addOrderBy
:
$qb->addOrderBy('column1', 'ASC')
->addOrderBy('column2', 'DESC');
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é!
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
...
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])
.