我有两个模型:
用户有很多帖子。帖子有很多评论,评论属于帖子。那很简单。
现在,如果帖子已经创建了评论,那么我现在想用其评论加载所有经过身份验证的用户的评论。如果该帖子今天没有评论,则不会被加载。这些帖子也会被分页。如何在laravel中雄辩地建立查询?
我尝试过这样的事情:
Auth::user()->posts->load(['comments' => function($query) {
$query->where('created_at',Carbon::today());
}]);
答案 0 :(得分:2)
查询中的问题是您已经在执行它。检查这部分:
Auth::user()->posts->...
^^^^^^^^
您正在作为属性访问该关系。执行此操作时,查询已在执行。您需要做的是在执行查询之前限制结果。为此,请访问关系,但要作为一个函数,通过这种方式,您将收到查询生成器的实例,以在执行查询之前应用所有约束(在此示例中为->get()
)。 To limit a relationship with conditions, you can make use of the whereHas()
:
$posts = Auth::user()->posts()->whereHas(['comments' => function($query) {
$query->where('created_at', '>=', today());
}])
->get();
在上面的代码中,您今天将收到所有带有至少一条评论的帖子。但是您尚未收到附加的评论。为此,您需要使用with()
方法来加载关系。
$posts = Auth::user()->posts()->whereHas('comments', function($query) {
$query->where('created_at', '>=', today());
})
->with('comments') // <--
->get();
应该这样做。但是鉴于您需要分页的元素,请将get()
与paginate()
方法交换:
$posts = Auth::user()->posts()->whereHas('comments', function($query) {
$query->where('created_at', '>=', today());
})
->with('comments')
->paginate(15); // <---