5

我正在尝试创建一个查询以从 Doctrine 数据库中检索对象,按特定一对多关系的成员数排序。

更具体地说:我有两个实体:个人和联邦。一个人可以是一个联盟的成员(Person 有'federation' 关系),一个联盟可能有n个人(Federation 作为'people' 关系)。

我想创建一个 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)]

第二个将是最佳结果,但第一个满足我的需要,如果第二种情况在单个查询中不可行的话。

提前致谢。

4

2 回答 2

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

于 2014-07-17T08:47:14.390 回答
6

您可以在 DQL 中使用 5 个聚合函数(Doctrine 2.2):AVGCOUNTMIN和.MAXSUM

以下查询应该有效:

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 技巧,我建议您查看官方 Doctrine 文档

于 2012-09-29T09:33:06.107 回答