2015-12-03 34 views
2

我正在用Lumen創建一個休息API。我有pictures & picture_likes表&模型,我想獲得最喜歡的圖片。查詢生成器到orderBy(groupBy'ed行的數量)並在X天前獲得條目

Pictures table樣子..

photo_id | path | owner_id | created_at 

PictureLikes table看起來像......

id | user_id who liked 
    0   1 
    1   2 
    2   4 
    3   3 
    4   5 
    etc...  

我的第一個問題是如何讓最喜歡的照片。我想我可以通過將類似的photo_id分組並按照他們的次數排序來實現最喜歡的照片。但是,我無法弄清楚如何按次數排序。

然後,我可以走得更遠,並獲得最近7天最喜歡的照片(這將相對於今天移動)。我的第二個問題是,如何過濾最喜歡的圖片,僅顯示最近X天的最喜歡的照片?

更新:我在我的第一個問題,成功與此:

$photos = Photo::all(); // returns all photos 
    $photoLikes = PhotoLikes::all(); // returns all photoLikes 

    $photoLikes = PhotoLike::select('photo_id', \DB::raw('count(*) as total')) 
            ->groupBy('photo_id') 
            ->orderBy('total', 'desc') 
            ->get()->toArray(); 

結果如下:

array:10 [ 
    0 => array:2 [ 
    "photo_id" => 1 
    "total" => 5 
    ] 
    1 => array:2 [ 
    "photo_id" => 10 
    "total" => 5 
    ] 
    ..etc 

但是,我怎麼可以使用這個變量獲得從剛剛過去的照片X天?

+0

你有嘗試過什麼嗎?你能描述一下你迄今爲止的嘗試嗎? – Ross

+0

@Ross我更新了代碼。我成功了我的第一個問題,但在第二個問題中迷失了...... – senty

+0

要從最後X天獲取照片,是不是隻需在查詢中添加where()子句以獲取其中created_at時間戳記爲比X天前更新? –

回答

2

在我開始之前,我覺得有點奇怪,你的視頻名稱叫做圖片。哈哈,同樣,你在圖片,視頻和照片之間調用了你的模型PicturePhoto,這對你實際命名的東西有點混亂。

無論如何,爲了達到你想要的,你可以使用joins。例如:

$pictures = Picture::selectRaw('pictures.*, count(picture_likes.photo_id) as total_likes') 
    ->join('picture_likes', 'picture_likes.photo_id', '=', 'pictures.photo_id') 
    ->groupBy('pictures.photo_id') 
    ->orderBy('total_likes', 'DESC') 
    ->get(); 

這將加入picturespicture_likes表。它將由photo_id分組。它選擇pictures表中的所有列,並從picture_likes表中計算photo_id的實例。它的別名計爲total_likes。這樣,您可以通過total_likes訂購。

有了這個,你可以循環使用它並做你想做的任何事情。例如,這將回顯出photo_idtotal_likes。現在

foreach ($pictures as $picture) 
{ 
    echo $picture->photo_id . ': ' . $picture->total_likes . '<br>'; 
} 

,有一個與獲得了最喜歡的照片在過去7天,因爲你的picture_likes表沒有一個created_at柱表示,當照片被喜歡的一個問題。相反,您只能獲得過去7天內創建的最受歡迎的照片。兩者意味着根本不同的事情。第一個是當前表結構不可能的。第二個是可行的。就在whereDate方法添加到上面的例子是這樣的:

$pictures = Picture::selectRaw('pictures.*, count(picture_likes.photo_id) as total_likes') 
    ->whereDate('pictures.created_at', '>=', Carbon::now()->subWeek()) 
    ->leftJoin('picture_likes', 'picture_likes.photo_id', '=', 'pictures.photo_id') 
    ->groupBy('pictures.photo_id') 
    ->orderBy('total_likes', 'DESC') 
    ->get(); 

再次,這將讓內過去7天中創建的最喜歡的照片。我用Carbon獲取當前日期/時間並減去一週。

+0

哇!王牌男人!非常感謝!!我想要的是你展示的那個(不是最喜歡的。本週的照片):)乾杯! – senty

+0

我試過你的例子,但我收到的集合是空的:/我在做什麼錯了?這條線是問題' - > groupBy('photos.id')' – senty

+0

並註釋掉' - > groupBy('pictures.photo_id')'和' - > orderBy('total_likes','DESC')'行,並在' - > get()'後面添加' - > toArray()',我正在接收數組:路徑「=> null 」created_at「=> null 」updated_at「=> null 」total_likes「=> 0 ] ]' – senty

相關問題