Упорядковуйте декілька стовпців із доктриною


115

Мені потрібно замовити дані за двома стовпцями (коли рядки мають різні значення для стовпця №1, упорядкуйте їх, інакше впорядкуйте за стовпцем №2)

Я використовую QueryBuilder для створення запиту.

Якщо я зателефоную orderBy метод вдруге, він замінює будь-які раніше задані замовлення.

Я можу передавати два стовпчики як перший параметр:

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

Але я не можу пропустити два напрямки впорядкування для другого параметра, тому при виконанні цього запиту перший стовпець упорядковується у висхідному напрямку, а другий - у низхідному. Я хотів би скористатися низхідним для обох.

Чи є спосіб зробити це за допомогою QueryBuilder? Чи потрібно використовувати DQL?

Відповіді:


213

Ви повинні додати напрямок замовлення відразу після назви стовпця:

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

Як ви вже зазначали, кілька дзвінків orderBy не зберігаються , але ви можете робити кілька дзвінків на addOrderBy:

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

2
Дякую. я цього не помічав раніше. Я подумав, що для цього дві заявки порядку. тому я не усвідомлював метод addOrderBy. ура для його вказівки :)

Дієго Агулло: На жаль, обидва посилання у вашій відповіді більше не працюють.
k00ni

1
@ k00ni дякую, що вказали на це. Я оновив перший до останніх документів, але не міг знайти перенесену проблему DC-909 на GitHub, тому видалив останній.
Дієго

Для будівельників запитів із псевдонімом таблиць не забудьте додати alias.column_name.
Маулік Пармар

16

У Doctrine 2.x ви не можете передати декілька замовлень, використовуючи doctrine 'orderBy' або 'addOrderBy', як наведено вище. Тому що він автоматично додає "ASC" в кінці імені останнього стовпця, коли ви залишили другий параметр порожнім, наприклад у функції "orderBy".

Для прикладу ->orderBy('a.fist_name ASC, a.last_name ASC')виведемо SQL приблизно на зразок цього «ЗАМОВИТИ Ім'я ASC, прізвище ASC ASC». Отже, це помилка синтаксису SQL. Просто тому, що за замовчуванням для orderBy або addOrderBy є "ASC".

Щоб додати кілька замовлень, потрібно скористатися функцією "додати". І воно буде таким.

->add('orderBy','first_name ASC, last_name ASC'). Це дасть вам правильно відформатований SQL.

Детальніше про функцію add (). https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/query-builder.html#low-level-api

Сподіваюся, це допомагає. Ура!


8

ви можете використовувати ->addOrderBy($sort, $order)

Додати: Доктрина Querybuilder btw. часто використовує «спеціальні» модифікації звичайних методів, см select-addSelect, where-andWhere-orWhere, groupBy-addgroupBy...


0

Коментар для orderByвихідного коду приміток: Keys are field and values are the order, being either ASC or DESC.. Так ви можете зробити orderBy->(['field' => Criteria::ASC]).


Це неправильно. Дивіться мою відповідь вище
Томас Хансен

0

orderByМетод вимагає або два рядки або Expr\OrderByоб'єкта. Якщо ви хочете додати декларації декількох замовлень, правильним є використання addOrderByметоду або інстанція OrderByоб'єкта та заповнення його відповідно:

   # 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)
   ;
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.