2013-11-14 61 views
1

我設計者試圖在這裏學到的編碼和Laravel是如此之大,它使設計像我一樣能夠創造自己的東西微笑用雄辯的工作,如何選擇熱門評論

關於我的問題,我接下來是一些教程,現在我學習構建簡單的博客系統。 因此,我有Post模型與Like模型有關係$this->morphMany('Like','likeable','likeable_type');。 到目前爲止,一切正常。現在我希望能夠創建「熱門帖子」頁面,該頁面基本上顯示了受歡迎程度排序的帖子,這是我喜歡的數字。

的 '喜歡' 表中有這些領域id | likable_id | likeable_type

  • 'likeable_type',在這種情況下,是 '後'
  • 'likeable_id' 是的帖子ID鏈接到ID在 '帖子' 表

所以在我的控制器,我試過這個。

$popular_ids = DB::table('likes') 
        ->select('likeable_id') 
        ->groupBy('likeable_id') 
        ->orderBy(DB::raw('COUNT(likeable_id)'), 'DESC') 
        ->get(); 
$popular_posts = Post::whereIn('id',array_pluck($popular_ids,'likeable_id'))->paginate(15); 

這給了我所有的熱門帖子,但不是我想要的順序。 我不確定是否有更好的方法來實現這個目標,或者似乎我只想念另一個'orderBy'方法?

對此有何建議?

ps。對不起,我的英文不好

回答

0

SQL IN不保持順序。要實現這一點,必須使用ORDER BY FIELD('id',,,...)來實現這一點。

$ids = array_pluck($popular_ids,'likeable_id'); 
$raw = DB::raw('FIELD(id,' + implode(',', $ids) + ')'); 

$popular_posts = Post::whereIn('id', $ids)->orderBy($raw)->paginate(15); 

欲瞭解更多信息,請參閱,

Maintaining order in MySQL "IN" query

+0

謝謝你的時間分享你的答案Tharanga。我從來沒有聽說過FIELD!我今天學到了一些新東西。我修改了Collin答案中的代碼,它可以工作。 :) –

0

我將與加入做到這一點。這有點複雜,但如果你想了解內部的內容,你應該閱讀LEFT JOIN和INNER JOIN。這個例子由於多態關係而特別難看。

Post::select('posts.*', DB::raw('COUNT(DISTINCT likes.id) AS popularity')) 
    ->leftJoin('likes', function ($join) 
    { 
     $join->on('likes.likeable_id', '=', 'posts.id') 
      ->on('likes.likeable_type', '=', DB::raw("'Post'")); 
    }) 
    ->orderBy('popularity', 'DESC') 
    ->paginate(15); 

有一個好處,現在可以在帖子上獲得流行值。

$post->popularity; 
0

謝謝科林爲您的時間!你的答案將我引向光明!我修改了你的答案,最後得到我需要的。儘管如此,我仍然試圖完全理解它。這是我結束了。

Post::select('posts.*', DB::raw('COUNT(likes.likeable_id) AS popularity')) 
    ->join('likes', function($join) 
    { 
     $join->on('likes.likeable_id', '=', 'posts.id') 
      ->on('likes.likeable_type', '=', DB::raw("'Post'")); 
    }) 
    ->groupBy('likes.likeable_id') 
    ->orderBy('popularity', 'DESC') 
    ->paginate(15); 

Ps。即使這段代碼給了我我想要的東西,但我不確定我的db設計是否正確。