我正在用Lumen创建一个休息api。我有pictures
& picture_likes
表&模特,我试图得到最喜欢的图片。
我的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_ids进行分组并根据它们的数量对它们进行排序来获得最喜欢的照片。但是,我无法弄清楚如何按计数订购。
然后,我可以更进一步,获得最近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 :(得分:2)
在开始之前,我发现您的视频的表名称称为图片有点奇怪。哈哈,你也称你的模型为Picture
和Photo
,所以在图片,视频和照片之间,对于你实际命名的内容有点令人困惑。
无论如何,为了达到你想要的效果,你可以使用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();
这将加入pictures
和picture_likes
表。它将按photo_id
分组。它选择pictures
表中的所有列,并从photo_id
表中计算picture_likes
的实例。它的别名计为total_likes
。这样,您可以按total_likes
订购。
有了这个,你可以循环它并做你想做的任何事情。例如,这将回显photo_id
和total_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获取当前日期/时间并减去一周。