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)
第二个是最佳结果,但第一个满足我的需求,如果第二个案例在单个查询中不可行.
提前致谢.
你可以做一些事情:
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
有在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
Run Code Online (Sandbox Code Playgroud)
对于更多DQL技巧,我建议你查阅官方的Doctrine文档.
| 归档时间: |
|
| 查看次数: |
3953 次 |
| 最近记录: |