【问题标题】:Doctrine error when using SUM(a.id=1) as `ìdentifier`: Expected Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS, got '='使用 SUM(a.id=1) 作为 `ìdentifier` 时的教义错误:预期的 Doctrine\ORM\Query\Lexer::T_CLOSE_PARENTHESIS,得到 '='
【发布时间】:2013-12-21 19:54:33
【问题描述】:

我正在尝试在学说中执行包含类似内容的查询

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

【问题讨论】:

  • 我猜你不需要在 dql 中像 1 那样对 sum_1 进行反引号,或者你可以看看 stackoverflow.com/questions/1513384/…
  • 但错误表明它在 a.id=1 上崩溃,= 符号。我认为它正在寻找 sum 函数的结尾,右括号)
  • 您对SUM(a.id=1) 有什么期望?这个语句必须做什么?
  • 它总结了 id 字段(也可以计算,是的),我在 mysql 中尝试过,它给了我正确的结果。只是在教义中的 = 失败
  • 嗯,它一直抛出这个错误,我在文档中找不到解决方案

标签: php symfony doctrine-orm dql query-builder


【解决方案1】:

考虑到错误消息,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

这可能会对查询性能产生负面影响。

【讨论】:

    【解决方案2】:

    Doctrine 似乎不支持这种语法。您可以重写您的查询(可能会想到子查询或某些连接)或使用原生 MySQL 查询。

    【讨论】:

    猜你喜欢
    • 2013-12-26
    • 1970-01-01
    • 2012-08-17
    • 2016-05-20
    • 1970-01-01
    • 2012-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多