如何按关系的数量或成员对Doctrine DQL查询进行排序?

时间:2012-09-28 19:04:54

标签: database symfony doctrine doctrine-orm dql

我正在尝试创建一个查询,用于从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)]

第二个是最佳结果,但如果第二个案例在单个查询中不可行则第一个满足我的需要。

提前致谢。

2 个答案:

答案 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):AVGCOUNTMINMAXSUM

以下查询应该有效:

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