查询构建器到orderBy(groupBy'ed行的数量)&在X天前获得参赛作品

时间:2015-12-03 02:45:14

标签: php laravel query-builder lumen

我正在用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天的照片?

1 个答案:

答案 0 :(得分: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表中的所有列,并从photo_id表中计算picture_likes的实例。它的别名计为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获取当前日期/时间并减去一周。