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

Ale*_*lho 5 database doctrine dql symfony doctrine-orm

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

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

我想创建一个DQL查询,它将返回联合列表,按照该联盟成员的数量排序.这些方面的东西:

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of members of f.people]
Run Code Online (Sandbox Code Playgroud)

那将是第一步.还有一个额外的第二步,我不知道是否可以通过单个查询实现,这将在计数之前过滤关系的成员.像这样:

SELECT f FROM AcmeStatsBundle:Federation f ORDER BY [number of (f.people p where p.attr = value)]
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

Jim*_*oot 8

你可以做一些事情:

public function getFederationsOrderedByNumberOfPeople()
{
    return $this->createQueryBuilder('f')
        ->addSelect('COUNT(p) AS HIDDEN personCount');
        ->leftJoin('f.people', 'p');
        ->groupBy('f')
        ->orderBy('personCount', 'DESC');
}
Run Code Online (Sandbox Code Playgroud)

HIDDEN关键字已在Doctrine 2.2中添加,这意味着所选字段不会出现在结果中,在这种情况下,这意味着您只需返回实体而不是数组.

参考DQL SELECT文档:http://doctrine-orm.readthedocs.org/en/latest/reference/dql-doctrine-query-language.html#dql-select-examples


gil*_*den 6

有在DQL 5个聚合函数可以使用(2.2学说)AVG,COUNT,MIN,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
Run Code Online (Sandbox Code Playgroud)

对于更多DQL技巧,我建议你查阅官方的Doctrine文档.

  • 谢谢你的回答!我不得不对Query进行一些修改,因为我认为你不能在没有选择它的情况下对聚合进行ORDER BY.所以最后的查询是:`SELECT f,COUNT(p)as qtd FROM AcmeStatsBundle:Federation f LEFT JOIN f.people p WHERE p.attr =:some_value GROUP BY f.id ORDER BY qtr`:D (2认同)