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

标签 php sql symfony doctrine-orm dql

我有两个实体

  • 文章
  • 用户

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

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

的一部分

有什么想法吗?

最佳答案

如果您想选择“多个”值,您需要将它们指定到查询构建器的选择方法中。就像下面报道的一样

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

关于php - Doctrine2,按多对多属性的计数获取实体顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29512078/

相关文章:

symfony - 在我的表单 Symfony2 中创建重复字段

php - 如何在mysql数据库中添加特殊字符,如括号[]、单引号 ' double quote"

javascript - 如果 JavaScript 计时器正在运行,则防止 session 超时

sql - ANSI SQL 手册

sql - Django ORM : Getting rows based on max value of a column

php - Symfony2 子表单

javascript - 使用ajax发送$_POST变量到php

php - 操作码缓存实际上是如何工作的?

mysql - 查询从一个表和一个额外的列检索信息,这是另一个表的条件

php - 使用 Symfony 覆盖 config_dev 中的 mapping_types 部分