Laravel 5.1 - 趋势帖子 - 查询关系计数与枢轴的时间戳条件

时间:2015-07-09 10:33:55

标签: laravel eloquent laravel-5

我正在使用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();
    }
);

1 个答案:

答案 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();