Порядок по нескольким столбцам с доктриной

Мне нужно заказывать данные по двум столбцам (когда строки имеют разные значения для столбца номер 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]).