Doctrine2错误"预期的已知功能,得到了#COUNT'"按顺序时

时间:2017-04-10 21:12:30

标签: php symfony doctrine-orm dql

我正在使用doctrine2

我试着获得"事件"按售票数量排序

$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()
;

这会产生错误

  

[语法错误]第0行,第80行:错误:预期的已知功能,得到“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()
;

COUNT子句中使用ORDER BY是否已知DQL的限制?

1 个答案:

答案 0 :(得分:4)

学说文档中的EBNF实际上说明了ORDER BY子句中可能的内容:

OrderByClause       ::= "ORDER" "BY" OrderByItem {"," OrderByItem}*
OrderByItem ::= (SimpleArithmeticExpression | SingleValuedPathExpression | ScalarExpression | ResultVariable | FunctionDeclaration) ["ASC" | "DESC"]

FunctionDeclaration包含以下功能:

FunctionsReturningNumerics: LENGTH LOCATE ABS SQRT MOD SIZE DATE_DIFF BIT_AND BIT_OR

FunctionsReturningDateTime: CURRENT_DATE CURRENT_TIME CURRENT_TIMESTAMP DATE_ADD DATE_SUB

FunctionsReturningStrings: CONCAT SUBSTRING TRIM LOWER UPPER IDENTITY

COUNTAggregateExpression组(Link)的一部分,ORDER BY子句中不允许使用这些内容。

此外,文档实际上还有一个示例,使用AS HIDDEN按顺序排序:

  

在ORDER子句中使用算术表达式检索用户实体,   使用HIDDEN关键字:

$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