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

COUNTAggregateExpression 组 (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