Doctrine2,通过多对多属性的计数获得实体顺序 [英] Doctrine2 , get entities order by count of a many to many property

查看:46
本文介绍了Doctrine2,通过多对多属性的计数获得实体顺序的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个实体

  • 文章
  • 用户

文章与名为"likedByUsers"的用户有关

Article has a relation to user named 'likedByUsers'

现在,我想按喜欢的次数来排序文章,但是:

Now, I would like to get the articles order by number of likes, but:

  • 我不想拥有'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),但不会返回文章"本身

this correctly returns the number of likes (with 0 for articles without likes), but it does NOT return the Articles themselves

我尝试添加

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

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

有什么想法吗?

推荐答案

如果要选择多个"值,则需要在查询生成器的select方法中指定它们.就像下面的报道

If you want to select "multiple" values you need to specify them into select method of query builder. Just like reported below

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

您必须记住,结果将不是一个实体,而是一个关联数组

You have to remember that result will not be an entity but an associative array

如果您想要完整的实体

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

这篇关于Doctrine2,通过多对多属性的计数获得实体顺序的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆