Порядок по нескольким столбцам с доктриной
Мне нужно заказывать данные по двум столбцам (когда строки имеют разные значения для столбца номер 1, порядок от него, в противном случае порядок по столбцу номер 2)
Я использую QueryBuilder
для создания запроса.
Если второй раз вызвать метод orderBy
, он заменяет любые ранее заданные упорядочения.
Я могу передать два столбца в качестве первого параметра:
->orderBy('r.firstColumn, r.secondColumn', 'DESC');
Но я не могу передать два порядка для второго параметра, поэтому, когда я выполняю этот запрос, первый столбец упорядочен в восходящем направлении, а второй - по убыванию. Я хотел бы использовать спуск для обоих из них.
Есть ли способ сделать это, используя QueryBuilder
? Нужно ли использовать DQL?
Ответы
Ответ 1
Вы должны добавить направление заказа сразу после имени столбца:
$qb->orderBy('column1 ASC, column2 DESC');
Как вы уже отмечали, несколько вызовов orderBy
не стекаются, но вы можете совершать несколько вызовов addOrderBy
:
$qb->addOrderBy('column1', 'ASC')
->addOrderBy('column2', 'DESC');
Ответ 2
В Doctrine 2.x вы не можете передать множественный порядок, используя doctrine 'orderBy' или 'addOrderBy', как в приведенных выше примерах. Потому что он автоматически добавляет "ASC" в конце имени последнего столбца, когда вы оставляете второй параметр пустым, например, в функции "orderBy".
Например, ->orderBy('a.fist_name ASC, a.last_name ASC')
выведет SQL ->orderBy('a.fist_name ASC, a.last_name ASC')
похожий на этот "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
Надеюсь это поможет. Ура!
Ответ 3
вы можете использовать ->addOrderBy($sort, $order)
Добавить: Doctrine Querybuilder кстати. часто использует "специальные" модификации нормальных методов, см. select-addSelect
, where-andWhere-orWhere
, groupBy-addgroupBy
...
Ответ 4
Комментарий к исходному коду orderBy
Примечания: Keys are field and values are the order, being either ASC or DESC.
, Так что вы можете сделать orderBy->(['field' => Criteria::ASC])
.