Doctrine2 ,按多对多计数获取实体顺序 属性

Doctrine2 , get entities order by count of a many to many property

我有两个实体

文章与名为 'likedByUsers'

的用户有关系

现在,我想按点赞数排序文章,但是:

我目前拥有的是:

$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();