Доктрина DQL ГДЕ С ДЕЛО? - PullRequest
       12

Доктрина DQL ГДЕ С ДЕЛО?

0 голосов
/ 01 ноября 2018

Не дубликат.

Я спрашиваю, как заставить работать CASE или почему он не работает (особенно если учесть, что то же выражение CASE работает в чистом SQL). Я НЕ ищу альтернативных решений.


Я работаю с Doctrine ORM (и его производным от SQL языком запросов - DQL) и пытаюсь создать DQL-запрос с выражением CASE в предложении WHERE, но Doctrine выдает мне ошибку.

DQL: SELECT p FROM Entity\Product p WHERE (CASE WHEN p.price < 20 THEN p.quantity >= 30 ELSE p.quantity > 5 END)

Я получаю следующую ошибку:
[Syntax Error] line 0, col 87: Error: Expected Doctrine\ORM\Query\Lexer::T_ELSE, got '>'
(вокруг >= 30 выше)

Я не могу понять, что я делаю неправильно. Я знаю, что DQL поддерживает выражения CASE. Я нашел ТАК ответы, которые используют их. По крайней мере, в трассировке стека есть вызов парсера, подтверждающий это.

Тот же оператор SQL:
SELECT p.* FROM product p WHERE (CASE WHEN p.price < 20 THEN p.quantity >= 30 ELSE p.quantity > 5 END) работает как надо.

1 Ответ

0 голосов
/ 01 ноября 2018

С помощью коллеги и на основе формальной грамматики DQL я ошибаюсь в попытке использовать неподдерживаемую функцию .

В настоящее время (по состоянию на Doctrine v2.6) DQL просто не поддерживает выражение CASE с условным выражением . Он может ТОЛЬКО оценивать ScalarExpression, как определено в синтаксисе, который не может быть экземпляром ConditionalExpression.

ScalarExpression      ::= SimpleArithmeticExpression | StringPrimary | DateTimePrimary | StateFieldPathExpression | BooleanPrimary | CaseExpression | InstanceOfExpression
CaseExpression        ::= GeneralCaseExpression | SimpleCaseExpression | CoalesceExpression | NullifExpression
GeneralCaseExpression ::= "CASE" WhenClause {WhenClause}* "ELSE" ScalarExpression "END"
WhenClause            ::= "WHEN" ConditionalExpression "THEN" ScalarExpression
SimpleCaseExpression  ::= "CASE" CaseOperand SimpleWhenClause {SimpleWhenClause}* "ELSE" ScalarExpression "END"
CaseOperand           ::= StateFieldPathExpression | TypeDiscriminator
SimpleWhenClause      ::= "WHEN" ScalarExpression "THEN" ScalarExpression
CoalesceExpression    ::= "COALESCE" "(" ScalarExpression {"," ScalarExpression}* ")"
NullifExpression      ::= "NULLIF" "(" ScalarExpression "," ScalarExpression ")"
...