我有两个表
posts
和employees
,它们具有多对多关系。
现在我想查询数据透视表中
user_id
是登录用户而status
是Accepted
的所有帖子。
我的疑问:
public function accepted()
{
$posts = Post::with(['employees' => function ($q) {
$q->wherePivot('status', 'Accepted')
->where('user_id', Auth::id());
}])
->with('address', 'service')
->orderBy('created_at', 'DESC')
->paginate(10);
return response()->json($posts);
}
如果您查看下图,即使数据透视表中的条件不成立,所有帖子都会返回。
在上图中,有两行,第一行
employees[]
是空的,我不想返回。并且只能返回第二行,因为 employees.pivot
中的条件为 true。
我希望能很好地解释它。
将闭包传递给
with
指定要加载哪些相关模型 (Employee
),但不会过滤您正在查询的模型 (Post
)。
要添加该过滤器,您需要使用
whereHas(relation, Closure)
$posts = Post::query()
->whereHas('employee', function ($rel) {
$rel->where('your_pivot_table_name.status', 'Accepted')
->where('user_id', Auth::id());
})
->with([
'address',
'service',
'employees' => function ($rel) {
$rel->wherePivot('status', 'Accepted')
->where('user_id', Auth::id());
}
])
->orderByDesc('created_at')
->paginate(10);