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



我有两个实体

  • 文章
  • 用户

文章与名为"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')

但它失败了,因为CCD_ 1不是CCD_ 2 的一部分

有什么想法吗?

如果您想选择"多个"值,您需要将它们指定到查询生成器的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();

您可以查看两个函数:

->addSelect

在创建queryBuilder时(我相信)这将不起作用,但应该与以下方式一起使用。

您也可以这样使用基本查询生成器:

    $query = $this->getEntityManager()->createQueryBuilder()
        ->select('article, nbrLikes, ...')
        ->from('BundleName:ClassName', 'article')
        ->leftJoin('article.likedByUsers', 'nbrLikes')

这将始终选择并填充select中的实体。您也可以进行一些部分选择,以避免获得必要的字段。这显然不是一个解决方案,但可能会为你指明正确的方向。

相关内容

  • 没有找到相关文章

最新更新