在查询范围中过滤With()

时间:2019-12-14 00:45:16

标签: mysql laravel eloquent

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

1 个答案:

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

如果您需要更多信息,请发表评论,我会编辑答案。