我正在使用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的限制?
答案 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
COUNT
是AggregateExpression
组(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