2016-05-28 57 views
1

我有2個型號; PostRating按一對多平均值排序相關表列

Rating模型包含一個amount列,它指定了評分有多高。這是基於5星評級,所以數量可以是一個數值從1-5

Post模型與評分模型和功能稱爲Ratings返回hasMany一對多關係。

我想根據平均評分獲得5篇最新帖子。對於一般的評價,我創建了一個可以在下面

注意中可以看出功能:複數(等級)返回的hasMany關係,其中單數(額定值)返回的值是平均收視

public function Rating(){ 
    return floor($this->Ratings()->avg('rating')); 
} 

是否可以使用Eloquent QueryBuilder檢索由平均評級排序的帖子?

目前我正在檢索所有帖子,然後在集合對象上使用sortBy方法,以獲得最高平均評分的方法。我這樣做的方式可以在下面看到。

$posts = Post::all(); 

$posts = $posts->sortByDesc(function ($post, $key) { 
    return $post->Rating(); 
}); 

現在,如果我只想顯示5我還是要檢索和分類這似乎不是很友好的資源(在我眼裏的一切。我沒有這個什麼證據或者說它是真的)。

所以我的問題是這樣的:這是可以使用Eloquent而不是排序FULL集合可行。

小問題:使用Eloquent而不是排序集合會對效率有任何影響嗎?

回答

0

您可以使用查詢生成器

DB::table('post') 
    ->select('post.id', 'AVG(rating.amount)') 
    ->join('rating', 'post.id', '=', 'rating.post_id') 
    ->groupBy('post.id') 
    ->orderByRaw('AVG(rating.amount) DESC'); 
+1

謝謝您的答覆。即使這不是我正在尋找的東西(按照我期望的方式,我已經實現了這種方式),我會使用它,因爲我認爲將每個帖子的集合進行排序會更好(特別是在長時間可能有成千上萬個帖子的情況下) – DutchDevNet