我正在尝试创建一个查询,用于从Doctrine数据库中检索对象,并按特定的一对多关系的成员数进行排序。
更具体地说:我有两个实体:人和联盟。一个人可以是一个联盟的成员(人有'联邦'关系),联盟可能有 n 人(联盟为'人'关系)。
我想创建一个DQL查询,该查询将返回联盟列表,按照该联盟成员的数量排序。这些方面的东西:
SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of members of f.people]
这将是第一步。还有一个额外的第二步,我不知道是否可以通过单个查询实现,这将在计数之前过滤关系的成员。像这样:
SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of (f.people p where p.attr = value)]
第二个是最佳结果,但如果第二个案例在单个查询中不可行则第一个满足我的需要。
提前致谢。
答案 0 :(得分:8)
您可以采取以下措施:
public function getFederationsOrderedByNumberOfPeople()
{
return $this->createQueryBuilder('f')
->addSelect('COUNT(p) AS HIDDEN personCount');
->leftJoin('f.people', 'p');
->groupBy('f')
->orderBy('personCount', 'DESC');
}
在Doctrine 2.2中添加了HIDDEN关键字,这意味着所选字段不会出现在结果中,在这种情况下,这意味着您只需返回实体而不是数组。
参考DQL SELECT文档:http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples
答案 1 :(得分:6)
您可以使用DQL中的5个聚合函数(Doctrine 2.2):AVG
,COUNT
,MIN
,MAX
和SUM
。
以下查询应该有效:
SELECT f
FROM AcmeStatsBundle:Federation f
LEFT JOIN f.people p
GROUP BY f.id
ORDER BY COUNT(p)
WHERE p.attr = :some_value
对于更多DQL技巧,我建议您查找official Doctrine docs。