Controller
$r = \App\User::whereIn('id', $user_ids)->withPosts($category_id)->get();
User model
public function scopeWithPosts($query, $category_id)
{
return $query->with('posts')->where('category_id', $category_id);
}
我在这已经呆了好几个小时了。
我正在尝试将with()与查询范围一起使用,以为关系添加一个额外的过滤器。
但是它给我错误“用户表中不存在category_id”吗?我想念什么? Laravel 6
答案 0 :(得分:1)
您遇到的问题是您期望with('posts')
函数返回相对于Posts ORM模型的查询。不会,它仍然会返回对原始查询的引用。您会发现with
函数返回$this
,因此您将始终获得原始查询。
您要尝试的是通过SQL查询查找User
,然后通过另一个SQL查询获取该用户的所有Post
记录,并按类别过滤这些帖子。所以
SELECT * FROM Users WHERE id=?;
SELECT * FROM Posts WHERE user_id = ? AND category_id = ?
要在雄辩的关系中做到这一点,您需要进行子查询,如下所示:
return $query->with(['posts' => function ($q) use ($category_id) {
$q->where('category_id', $category_id);
}]);
如果您需要更多信息,请发表评论,我会编辑答案。