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

时间:2015-04-08 10:25:29

标签: php sql symfony doctrine-orm dql

我有两个实体

  • 文章
  • 用户

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

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

我已尝试添加

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

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

任何想法?

2 个答案:

答案 0 :(得分: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();

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


如果你想要完整的实体

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

答案 1 :(得分:0)

您可以查看2个功能:

->addSelect

创建queryBuilder时(我相信)哪个不起作用,但应该按照以下方式使用。

您也可以这样使用基本查询构建器:

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

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