Я хочу запустить этот запрос с помощью 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
Если вы используете createQueryBuilder, вы можете использовать
$ query-> addSelect ("(CASE КОГДА имя типа" John% "THEN 0 КОГДА имя типа «John%» THEN 1 КОГДА имя типа «% John%» THEN 2 ELSE 3 END) КАК СКРЫТЫЙ ОРД "); $ query-> orderBy ('ORD', 'DESC');
Обратите внимание, что у вас должно быть «HIDDEN».
Вы также можете использовать собственный запрос doctrine.
CASE является специфичной для поставщика и не поддерживается по принципу доктрины.
Если результат небольшой, моя рекомендация состоит в том, чтобы вытащить весь набор результатов, а затем отсортировать массив.
Если набор результатов будет слишком большим, вы должны написать собственный запрос и увлажнить объект. См. Документацию Doctrine для собственного SQL для получения дополнительной информации об этом. Это выглядит страшно, но имеет смысл, когда вы проходите через пример.
В крайнем случае вы могли бы просто обойти доктрину и использовать низкоуровневый собственный SQL. Подробнее см. В этом сообщении .
Я знаю, что Doctrine Extensions имеет функцию IfElse, которая может работать, но я не слышал много историй успеха.