我有两个实体
- 文章
- 用户
文章与名为"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中的实体。您也可以进行一些部分选择,以避免获得必要的字段。这显然不是一个解决方案,但可能会为你指明正确的方向。