Ошибка Doctrine при использовании SUM(a.id=1) в качестве `идентификатора`: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, получено '='

Я пытаюсь выполнить запрос в доктрине, который содержит что-то вроде этого

SUM(a.id = 1) as `1`

по некоторым причинам это всегда дает мне следующую ошибку:

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

Это код, который я использую

 $result = $em->getRepository('MyBundle:PlayerAction')
            ->createQueryBuilder('pa')
            ->select(array(
                'SUM(a.id=1) as `1`,
                SUM(a.id=2) as `2`,
                SUM(a.id=3) as `3`,
                p.playerName,
                pa.timestamp'
            ))
            ->innerJoin('pa.action', 'a')
            ->innerJoin('pa.player', 'p')
            ->where('pa.timestamp > ?1')
            ->groupBy('p')
            ->setParameter(1, time() - $time)
            ->orderBy('p.playerName', 'ASC');

person Maxim    schedule 21.12.2013    source источник
comment
Я думаю, вам не нужны обратные галочки в dql как 1 до sum_1, или вы можете посмотреть stackoverflow.com/questions/1513384/   -  person M Khalid Junaid    schedule 22.12.2013
comment
Но ошибка указывает на его сбой на a.id=1, знак =. Я думаю, что он ищет конец функции суммы, закрывающую скобку)   -  person Maxim    schedule 22.12.2013
comment
Что вы ожидаете от SUM(a.id=1)? Что должно делать это заявление?   -  person Alexey B.    schedule 22.12.2013
comment
Он суммирует поля идентификатора (да, их тоже можно считать), я попробовал это в mysql, и он дает мне правильный результат. Просто терпит неудачу на = в доктрине   -  person Maxim    schedule 22.12.2013
comment
Хм, он продолжает выдавать эту ошибку, и я не могу найти решение в документации.   -  person Maxim    schedule 23.12.2013
comment
Вместо: SUM(a.id=1) as 1 Может быть, вам стоит попробовать сделать что-то вроде (SUM(a.id) Where a.id = 1) as '1'   -  person BENARD Patrick    schedule 27.12.2013
comment
Мне нужно 3 поля, я не думаю, что это сработает?   -  person Maxim    schedule 27.12.2013


Ответы (2)


Судя по сообщению об ошибке, кажется, что Doctrine самостоятельно анализирует ваши выражения MySQL. Как уже было предложено nietonfir, этот синтаксический анализатор может быть не полностью совместим с MySQL. Вы можете попробовать некоторые синтаксические варианты, например:

SUM(CASE a.id WHEN 1 THEN 1 ELSE 0 END) as `1`,
SUM(CASE a.id WHEN 2 THEN 1 ELSE 0 END) as `2`,
SUM(CASE a.id WHEN 3 THEN 1 ELSE 0 END) as `3`

or:

SUM(IF(a.id=1, 1, 0)) as `1`,
SUM(IF(a.id=2, 1, 0)) as `2`,
SUM(IF(a.id=3, 1, 0)) as `3`

Если это не удается, рефакторинг запроса; что-то в этом роде (здесь просто мысли вслух, я оставлю эквивалент QueryBuilder на ваше усмотрение):

SELECT
   (SELECT COUNT(*) FROM PlayerAction AS pa WHERE pa.player = p.id AND pa.timestamp > ?1 AND pa.action = 1) AS `1`,
   (SELECT COUNT(*) FROM PlayerAction AS pa WHERE pa.player = p.id AND pa.timestamp > ?1 AND pa.action = 2) AS `2`,
   (SELECT COUNT(*) FROM PlayerAction AS pa WHERE pa.player = p.id AND pa.timestamp > ?1 AND pa.action = 3) AS `3`,
   p.playerName
FROM Player p
ORDER BY p.playerName ASC

Это может отрицательно сказаться на производительности запросов.

person Ruud Helderman    schedule 26.12.2013

Doctrine, похоже, не поддерживает такой синтаксис. Вы можете либо переписать свой запрос (подзапросы или некоторые объединения), либо прибегнуть к собственному MySQL-Query.

person nietonfir    schedule 26.12.2013
comment
Я пытался писать нативные запросы, однако не совсем понимаю, как они работают в рамках доктрины. - person Maxim; 27.12.2013
comment
Попробуйте вопрос и решение, предоставленные для stackoverflow.com/questions/5120701/doctrine -2-собственный-запрос - person nietonfir; 27.12.2013