Doctrine2 错误 "Expected known function, got 'COUNT'" when in order by clause
Doctrine2 error "Expected known function, got 'COUNT'" when in order by clause
我正在使用 doctrine2
我尝试通过售出的门票数量
获得订购的"Events"数量
$manager = $this->getDoctrine()->getManager();
$builder = $manager->createQueryBuilder();
return $builder
->select('e')
->from('AppBundle:Event', 'e')
->leftJoin('e.tickets', 't')
->orderBy('COUNT(t)')
->groupBy('e.id')
->setMaxResults(10)
->getQuery()
->getResult()
;
这会产生错误
[Syntax Error] line 0, col 80: Error: Expected known function, got 'COUNT'
用下面的DQL产生
QueryException: SELECT e FROM AppBundle:Event e LEFT JOIN e.tickets t GROUP BY e.id ORDER BY COUNT(t.id) ASC
但是,如果我将 COUNT
放在 SELECT
部分,它确实可以正常工作(但是我必须做额外的处理以删除 SELECT 不需要的字段)
return $builder
->select('e')
->from('AppBundle:Event', 'e')
->addSelect('COUNT(t) AS nbrTicketsSold')
->leftJoin('e.t', 't')
->orderBy('nbrTicketsSold')
->groupBy('e.id')
->setMaxResults(10)
->getQuery()
->getResult()
;
在 ORDER BY
子句中使用 COUNT
是否是 DQL 的已知限制?
学说文档中的 EBNF 实际上说明了 ORDER BY
子句中的可能性:
OrderByClause ::= "ORDER" "BY" OrderByItem {"," OrderByItem}*
OrderByItem ::= (SimpleArithmeticExpression | SingleValuedPathExpression | ScalarExpression | ResultVariable | FunctionDeclaration) ["ASC" | "DESC"]
With FunctionDeclaration
包含这些功能:
函数返回数值:
LENGTH
LOCATE
ABS
SQRT
MOD
SIZE
DATE_DIFF
BIT_AND
BIT_OR
函数返回日期时间:
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
DATE_ADD
DATE_SUB
函数返回字符串:
CONCAT
SUBSTRING
TRIM
LOWER
UPPER
IDENTITY
COUNT
是 AggregateExpression
组 (Link) 的一部分,这些在 ORDER BY
子句中是不允许的。
此外,文档实际上还有一个进一步使用 AS HIDDEN
按计数排序的示例:
Retrieve user entities with Arithmetic Expression in ORDER clause,
using the HIDDEN keyword:
$query = $em->createQuery('SELECT u, u.posts_count + u.likes_count AS HIDDEN score FROM CmsUser u ORDER BY score');
$users = $query->getResult(); // array of User objects
我正在使用 doctrine2
我尝试通过售出的门票数量
获得订购的"Events"数量$manager = $this->getDoctrine()->getManager();
$builder = $manager->createQueryBuilder();
return $builder
->select('e')
->from('AppBundle:Event', 'e')
->leftJoin('e.tickets', 't')
->orderBy('COUNT(t)')
->groupBy('e.id')
->setMaxResults(10)
->getQuery()
->getResult()
;
这会产生错误
[Syntax Error] line 0, col 80: Error: Expected known function, got 'COUNT'
用下面的DQL产生
QueryException: SELECT e FROM AppBundle:Event e LEFT JOIN e.tickets t GROUP BY e.id ORDER BY COUNT(t.id) ASC
但是,如果我将 COUNT
放在 SELECT
部分,它确实可以正常工作(但是我必须做额外的处理以删除 SELECT 不需要的字段)
return $builder
->select('e')
->from('AppBundle:Event', 'e')
->addSelect('COUNT(t) AS nbrTicketsSold')
->leftJoin('e.t', 't')
->orderBy('nbrTicketsSold')
->groupBy('e.id')
->setMaxResults(10)
->getQuery()
->getResult()
;
在 ORDER BY
子句中使用 COUNT
是否是 DQL 的已知限制?
学说文档中的 EBNF 实际上说明了 ORDER BY
子句中的可能性:
OrderByClause ::= "ORDER" "BY" OrderByItem {"," OrderByItem}*
OrderByItem ::= (SimpleArithmeticExpression | SingleValuedPathExpression | ScalarExpression | ResultVariable | FunctionDeclaration) ["ASC" | "DESC"]
With FunctionDeclaration
包含这些功能:
函数返回数值:
LENGTH
LOCATE
ABS
SQRT
MOD
SIZE
DATE_DIFF
BIT_AND
BIT_OR
函数返回日期时间:
CURRENT_DATE
CURRENT_TIME
CURRENT_TIMESTAMP
DATE_ADD
DATE_SUB
函数返回字符串:
CONCAT
SUBSTRING
TRIM
LOWER
UPPER
IDENTITY
COUNT
是 AggregateExpression
组 (Link) 的一部分,这些在 ORDER BY
子句中是不允许的。
此外,文档实际上还有一个进一步使用 AS HIDDEN
按计数排序的示例:
Retrieve user entities with Arithmetic Expression in ORDER clause, using the HIDDEN keyword:
$query = $em->createQuery('SELECT u, u.posts_count + u.likes_count AS HIDDEN score FROM CmsUser u ORDER BY score'); $users = $query->getResult(); // array of User objects