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

all*_*mon 4 php sql dql symfony doctrine-orm

我有两个实体

  • 文章
  • 用户

文章与名为'likesByUsers'的用户有关系

现在,我想通过喜欢的数量订购文章,但是:

  • 我不想拥有属性'numberOfLikes'因为保持更新太多问题了
  • 我有太多的文章(100k +)对PHP方面的"排序"是现实的(事实上我们达到排序的限制是我问这个问题的原因)
  • 我可以忍受在返回值中没有得到喜欢的数量(因为序列化器稍后会使它水合)

我现在拥有的是:

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

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

我试过添加

->select('a, COUNT(u) AS HIDDEN nbrLikes')
Run Code Online (Sandbox Code Playgroud)

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

有任何想法吗 ?

Don*_*sto 6

如果要选择"多个"值,则需要将它们指定为查询构建器的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();
Run Code Online (Sandbox Code Playgroud)

您必须记住,结果不是实体,而是关联数组


如果你想要完整的实体

 $builder = $this->createQueryBuilder('a')
        ->select('COUNT(u) AS HIDDEN nbrLikes', 'a')
        ->leftJoin('a.likedByUsers', 'u') 
        ->orderBy('nbrLikes', 'DESC')
        ->groupBy('a')
        ->getQuery()
        ->getResult();
Run Code Online (Sandbox Code Playgroud)