我试图创建一个从数据库学说,由特定的一个一对多的关系,成员数进行排序检索对象的查询。
更具体地讲:我有两个实体:个人和联邦。 一个人可以是一个联盟的成员(Person有“联盟”关系),以及联邦可能有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)]
这第二个将是最佳结果,但第一个满足我的需求,如果第二种情况是不是在单个查询可行性的。
提前致谢。
有在DQL 5个聚合函数可以使用(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挂羊头卖狗肉,我建议你看看官方学说文档 。
你可以做线沿线的东西:
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