2016-03-27 3 views
0

я получил следующее учение запроса в Symfony2:Учение FIND_IN_SET приводит к ошибке: ожидаемый конец строки, у «(»

$query = $em 
    ->createQuery(" 
     SELECT m FROM MyBackendBundle:Merchant m 
     WHERE m.active = :active 
     ORDER BY FIND_IN_SET(m.range, 'all', 'without_special'), m.tradingAmount DESC 
    ") 
    ->setParameter('active', true) 
; 

Но это приводит к следующей ошибке:

[Syntax Error] line 0, col 112: Error: Expected end of string, got '(' 

и:.

QueryException: 
SELECT m FROM My\Bundle\BackendBundle\Entity\Merchant m 
WHERE m.active = :active 
ORDER BY FIND_IN_SET(m.range, 'all', 'without_special') ASC, m.tradingAmount DESC 

Я использую FIND_IN_SETdoctrine extension from beberlei, чтобы иметь возможность использовать его в запросе

Любые идеи, почему это происходит?

Update:

Использование FIND_IN_SET в SELECT, в качестве псевдонима так:

SELECT m, FIND_IN_SET(m.range, 'all', 'without_special') AS HIDDEN findInSet 
FROM MyBackendBundle:Merchant 
WHERE m.active = :active 
ORDER BY findInSet, m.productAmount DESC 

результаты в следующей ошибки:

[Syntax Error] line 0, col 56: Error: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got ',' 
+0

Я не уверен, но я не думаю, что вы можете использовать функции в 'order_by'. Один из способов - создать псевдоним для этого результата, например, SELECT m, FIND_IN_SET (m.range, 'all', 'without_special') как HIDDEN findInSet FROM .... ', а затем использовать этот псевдоним в' order_by' вместо , – qooplmao

+0

Пробовал это, в результате получилось: 'QueryException: [Синтаксическая ошибка] строка 0, col 53: Ошибка: ожидаемая доктрина \ ORM \ Query \ Lexer :: T_CLOSE_PARENTHESIS, got ','' Что не имеет для меня такого смысла, потому что есть закрывающая скобка, но нет запятой. –

+0

Извините, col 56 вместо 53 –

ответ

1

Благодаря комментариям @ qooplmao это рабочая версия:

$query = $em 
    ->createQuery(" 
     SELECT m, FIND_IN_SET(m.range, 'all,without_special') AS rangeOrdering 
     FROM MyBackendBundle:Merchant m 
     WHERE m.active = :active 
     ORDER BY rangeOrdering, m.tradingAmount DESC 
    ") 
    ->setParameter('active', true) 
; 

FIND_IN_SET имеет только два параметра и должен находиться в части запроса SELECT, поскольку функции не могут использоваться в части запроса ORDER BY.