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