2013-12-21 2 views
3

Я пытаюсь выполнить запрос в доктрине, который содержит что-то вроде этогоОшибка Doctrine при использовании SUM (a.id = 1) в качестве `` dentifier`: Ожидаемая доктрина ORM Query Lexer :: T_CLOSE_PARENTHESIS, got '='

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'); 
+0

Я думаю, вам не нужны обратные тики в dql как '1' to sum_1, или вы можете посмотреть http://stackoverflow.com/questions/1513384/cumulative-dql-with-doctrine –

+0

Но ошибка указывает на ее сбой на знаке a.id = 1, =. Я думаю, что он ищет конец функции sum, закрывающей скобки) –

+0

Что бы вы ожидали от 'SUM (a.id = 1)'? Что должно делать это заявление? –

ответ

5

Учитывая сообщение об ошибке, кажется, что 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` 

или:

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 

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

+0

Точно, что я искал, спасибо! –

0

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

+0

Я пробовал писать собственные запросы, однако я не совсем понимаю, как они работают в рамках доктрины –

+0

Попробуйте задать вопрос и решить проблему http://stackoverflow.com/questions/5120701/doctrine-2-native-query – nietonfir