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

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

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

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

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

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

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

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

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

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

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

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

В 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 (). http://www.doctrine-project.org/api/orm/2.2/class-Doctrine.ORM.QueryBuilder.html#_add

Надеюсь это поможет. Ура!

вы можете использовать ->addOrderBy($sort, $order)

Добавить: Doctrine Querybuilder кстати. часто использует «специальные» модификации обычных методов, см. select-addSelect , where-andWhere-orWhere , groupBy-addgroupBy