我正在使用laravel 5.1进行CMS开发。我有一个简单的帖子结构,用户和用户都可以喜欢帖子。
我想列出热门帖子(过去1周内以desc顺序排列最多的帖子)。帖子和用户有多对多的关系,并使用数据透视表来建立关系。
帖子模型
public function likedby()
{
return $this->belongsToMany('App\Models\User','user_like_post')
->withTimestamps();
}
用户模型
public function likes(){
return $this->belongsToMany('App\Models\Post','user_like_post')
->withTimestamps();
}
如何撰写有说服力的查询,以便收到热门帖子。我需要使用我觉得难以使用的数据透视表的时间戳。
这是我尝试的但它使用了' created_at'邮政表而不是数据透视表。
$trending = Post::with('likedby')->get()
->sortByDesc(function ($post){
$one_week_ago = Carbon::now()->subWeeks(1);
return $post->likedby
->where('created_at','>=',$one_week_ago)
->count();
}
);
答案 0 :(得分:1)
您可以在with
方法中约束一个急切的负载,但是这仍然会加载所有帖子,但只有在不到一周的时候才会加载所需的关系。这可能不是你想要的行为,但值得一提。
Post::with(['likedby' => function($query) {
$query->where('created_at', '>=', Carbon::now()->subWeeks(1));
}])->get();
要仅加载上周内受欢迎的帖子,whereHas
方法最适合您。这将为您提供在过去一周内有相关内容的帖子列表。
Post::whereHas('likedby', function ($query) {
$query->where('created_at', '>=', Carbon::now()->subWeeks(1));
})->get();