Упорядочить по нескольким столбцам с помощью Doctrine

115

Мне нужно упорядочить данные по двум столбцам (когда строки имеют разные значения для столбца номер 1, упорядочить по нему; в противном случае упорядочить по столбцу номер 2)

Я использую QueryBuilderдля создания запроса.

Если я вызываю orderByметод во второй раз, он заменяет все ранее указанные порядки.

Я могу передать два столбца в качестве первого параметра:

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

Но я не могу передать два направления упорядочения для второго параметра, поэтому, когда я выполняю этот запрос, первый столбец упорядочивается по возрастанию, а второй по убыванию. Я хотел бы использовать для них обоих по убыванию.

Есть ли способ сделать это с помощью QueryBuilder? Мне нужно использовать DQL?

zootropo
источник

Ответы:

213

Вы должны добавить направление заказа сразу после названия столбца:

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

Как вы отметили, несколько вызовов orderBy не складываются , но вы можете сделать несколько вызовов addOrderBy:

$qb->addOrderBy('column1', 'ASC')
   ->addOrderBy('column2', 'DESC');
Диего Агулло
источник
2
Спасибо. Я этого раньше не замечал. Я думал, что для этого подходят два оператора orderBy. поэтому я не осознавал метод addOrderBy. Ура за указание :)
Диего Агулло: К сожалению, обе ссылки в вашем ответе больше не работают.
k00ni
1
@ k00ni спасибо, что указали на это. Я обновил первую до последней версии документации, но мне не удалось найти перенесенную проблему DC-909 на GitHub, поэтому я удалил последнюю.
Диего
Для построителей запросов с псевдонимом таблицы не забудьте добавить alias.column_name.
Маулик Пармар,
16

В Doctrine 2.x вы не можете передавать множественный порядок, используя доктрину orderBy или addOrderBy, как в примерах выше. Потому что он автоматически добавляет «ASC» в конец имени последнего столбца, когда вы оставляете второй параметр пустым, например, в функции «orderBy».

Например ->orderBy('a.fist_name ASC, a.last_name ASC'), SQL будет выводить что-то вроде этого «ORDER BY first_name ASC, last_name 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)

Добавить: Doctrine 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)
   ;
Томас Хансен
источник