如何通过一个关系的数量或成员排序主义DQL查询?(How to sort a Doctrine DQ

2019-08-01 01:16发布

我试图创建一个从数据库学说,由特定的一个一对多的关系,成员数进行排序检索对象的查询。

更具体地讲:我有两个实体:个人和联邦。 一个人可以是一个联盟的成员(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)]

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

提前致谢。

Answer 1:

有在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挂羊头卖狗肉,我建议你看看官方学说文档 。



Answer 2:

你可以做线沿线的东西:

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



文章来源: How to sort a Doctrine DQL Query by the number or members of a relation?