2012-09-28 33 views
5

我试图创建一个查询从一个Doctrine数据库检索对象,按特定的一对多关系的成员数量排序。如何根据关系的数量或成员对Doctrine DQL Query进行排序?

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

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

有在DQL 5个聚合函数可以使用(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

+2

感谢您的回答!我不得不对查询做些微的修改,因为我认为如果不选择它,你不能对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 –

6

你可以做线沿线的东西:

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

教义2.2加入隐藏的关键字,就意味着选定字段将不会在结果,在这种情况下,这意味着你只是让你的实体回来,而不是一个数组。

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

+0

谢谢!这是做到这一点的方法! – Russ

相关问题