Doctrine2 ,按多对多计数获取实体顺序 属性
Doctrine2 , get entities order by count of a many to many property
我有两个实体
- 文章
- 用户
文章与名为 'likedByUsers'
的用户有关系
现在,我想按点赞数排序文章,但是:
- 我不想要 属性 'numberOfLikes' 因为保持更新太麻烦了
- 我有太多文章 (100k+) 对于 PHP 方面的 "sort" 来说是现实的(事实上我们已经达到排序的极限是我的原因我在问这个问题)
- 我可以忍受在 returned 值中没有得到喜欢的数量(因为序列化程序稍后会对其进行水合)
我目前拥有的是:
$builder = $this->createQueryBuilder('a');
->select('COUNT(u) AS nbrLikes')
->leftJoin('a.likedByUsers', 'u')
->orderBy('nbrLikes', 'DESC')
->groupBy('a.id')
->getQuery()
->getResult()
;
这是正确的 return 点赞数(没有点赞的文章为 0),但 return 文章本身
我试过添加
->select('a, COUNT(u) AS HIDDEN nbrLikes')
但它失败了,因为 a
不是 GROUP BY
的一部分
有什么想法吗?
你可以看看2个函数:
->addSelect
这(我相信)在创建 queryBuilder 时不起作用,但应该按照下面的方式使用。
您也可以这样使用基本查询生成器:
$query = $this->getEntityManager()->createQueryBuilder()
->select('article, nbrLikes, ...')
->from('BundleName:ClassName', 'article')
->leftJoin('article.likedByUsers', 'nbrLikes')
这将始终 select 并填充 select 中的实体。您也可以做一些部分 select 以避免获得必要的字段。
这绝对不是解决方案,但可能会为您指明正确的方向。
如果您想要 select "multiple" 值,您需要将它们指定到查询生成器的 select 方法中。就像下面报道的那样
$builder = $this->createQueryBuilder('a')
->select('COUNT(u) AS HIDDEN nbrLikes', 'a.id')
->leftJoin('a.likedByUsers', 'u')
->orderBy('nbrLikes', 'DESC')
->groupBy('a.id')
->getQuery()
->getResult();
你必须记住结果不是一个实体而是一个关联数组
如果你想要完整的实体
$builder = $this->createQueryBuilder('a')
->select('COUNT(u) AS HIDDEN nbrLikes', 'a')
->leftJoin('a.likedByUsers', 'u')
->orderBy('nbrLikes', 'DESC')
->groupBy('a')
->getQuery()
->getResult();
我有两个实体
- 文章
- 用户
文章与名为 'likedByUsers'
的用户有关系现在,我想按点赞数排序文章,但是:
- 我不想要 属性 'numberOfLikes' 因为保持更新太麻烦了
- 我有太多文章 (100k+) 对于 PHP 方面的 "sort" 来说是现实的(事实上我们已经达到排序的极限是我的原因我在问这个问题)
- 我可以忍受在 returned 值中没有得到喜欢的数量(因为序列化程序稍后会对其进行水合)
我目前拥有的是:
$builder = $this->createQueryBuilder('a');
->select('COUNT(u) AS nbrLikes')
->leftJoin('a.likedByUsers', 'u')
->orderBy('nbrLikes', 'DESC')
->groupBy('a.id')
->getQuery()
->getResult()
;
这是正确的 return 点赞数(没有点赞的文章为 0),但 return 文章本身
我试过添加
->select('a, COUNT(u) AS HIDDEN nbrLikes')
但它失败了,因为 a
不是 GROUP BY
有什么想法吗?
你可以看看2个函数:
->addSelect
这(我相信)在创建 queryBuilder 时不起作用,但应该按照下面的方式使用。
您也可以这样使用基本查询生成器:
$query = $this->getEntityManager()->createQueryBuilder()
->select('article, nbrLikes, ...')
->from('BundleName:ClassName', 'article')
->leftJoin('article.likedByUsers', 'nbrLikes')
这将始终 select 并填充 select 中的实体。您也可以做一些部分 select 以避免获得必要的字段。 这绝对不是解决方案,但可能会为您指明正确的方向。
如果您想要 select "multiple" 值,您需要将它们指定到查询生成器的 select 方法中。就像下面报道的那样
$builder = $this->createQueryBuilder('a')
->select('COUNT(u) AS HIDDEN nbrLikes', 'a.id')
->leftJoin('a.likedByUsers', 'u')
->orderBy('nbrLikes', 'DESC')
->groupBy('a.id')
->getQuery()
->getResult();
你必须记住结果不是一个实体而是一个关联数组
如果你想要完整的实体
$builder = $this->createQueryBuilder('a')
->select('COUNT(u) AS HIDDEN nbrLikes', 'a')
->leftJoin('a.likedByUsers', 'u')
->orderBy('nbrLikes', 'DESC')
->groupBy('a')
->getQuery()
->getResult();