Doctrine2 ,通过多对多属性的计数获取实体顺序

2024-03-19

我有两个实体

  • Article
  • User

文章与名为“likedByUsers”的用户相关

现在,我想按喜欢的数量排序文章,但是:

  • 我不想拥有“numberOfLikes”属性,因为更新它太麻烦了
  • 我有太多文章(100k+),无法在 PHP 端进行“排序”(事实上我们已经达到了排序的极限,这就是我问这个问题的原因)
  • 我可以忍受在返回值中没有得到喜欢的数量(因为序列化器稍后会将其水化)

我目前拥有的是这样的:

$builder = $this->createQueryBuilder('a');
    ->select('COUNT(u) AS nbrLikes')
    ->leftJoin('a.likedByUsers', 'u') 
    ->orderBy('nbrLikes', 'DESC')
    ->groupBy('a.id')
    ->getQuery()
    ->getResult()
;

这会正确返回喜欢的数量(没有喜欢的文章为 0),但它不会返回文章本身

我尝试过添加

->select('a, COUNT(u) AS HIDDEN nbrLikes')

但它失败了,因为a不属于GROUP BY

有任何想法吗 ?


如果您想选择“多个”值,则需要将它们指定到查询构建器的 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();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Doctrine2 ,通过多对多属性的计数获取实体顺序 的相关文章

随机推荐