簡體   English   中英

Doctrine2,通過多個屬性的計數獲取實體順序

[英]Doctrine2 , get entities order by count of a many to many property

我有兩個實體

  • 文章
  • 用戶

文章與名為'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

有任何想法嗎 ?

如果要選擇“多個”值,則需要將它們指定為查詢構建器的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();

你可以看看2個功能:

->addSelect

哪個(我相信)在創建queryBuilder時不起作用,但應該按照以下方式使用。

您也可以這樣使用基本查詢構建器:

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

這將始終選擇並填充選擇中的實體。 您也可以進行部分選擇以避免獲得必要的字段。 這絕對不是一個解決方案,但可能會指出你正確的方向。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM