Как ЗАКАЗАТЬ СЛУЧАЙ в Doctrine2 (Symfony2)

Я хочу запустить этот запрос с помощью Doctrine в Symfony 2.3. Но похоже, что Doctrine не понимает инструкцию CASE. Может ли кто-нибудь помочь? Заранее благодарю вас!

SELECT max(id) id, name
FROM cards
WHERE name like '%John%'
GROUP BY name
ORDER BY CASE WHEN name like 'John %' THEN 0
           WHEN name like 'John%' THEN 1
           WHEN name like '% John%' THEN 2
           ELSE 3
      END, name

Ответ 1

Если вы используете createQueryBuilder, вы можете использовать как

$query->addSelect("(CASE WHEN name like 'John %' THEN 0
           WHEN name like 'John%' THEN 1
           WHEN name like '% John%' THEN 2
           ELSE 3 END) AS HIDDEN ORD ");
$query->orderBy('ORD', 'DESC');

Обратите внимание, что у вас должно быть "HIDDEN".

Вы также можете использовать собственный запрос doctrine.

Ответ 2

CASE является специфичной для вендора и не поддерживается из-за доктрины.

Если результат невелик, моя рекомендация состоит в том, чтобы вытащить весь набор результатов, а затем отсортировать массив.

Если набор результатов будет слишком большим, вы должны написать собственный запрос и увлажнить объект. Дополнительную информацию об этом см. В Документация Doctrine для собственного SQL. Это выглядит страшно, но имеет смысл, когда вы проходите через пример.

В качестве последнего средства вы можете просто обойти доктрину и использовать низкоуровневый собственный SQL. Подробнее см. этот пост.

Я знаю Расширения Doctrine имеют функцию IfElse, которая может работать, но я не слышал много историй успеха.