我有两个表和关系如下 用户 用户表:
图书表:
关系是这样的 用户->书籍(HasMany)
return $this->hasMany(Book::class,'user_id','id');
我的查询如下
User::with('book')
->WhereHas('book', function($query) {
$query->where(['active'=> 1]);
})
->where(['id'=> 1,'active'=>1])
->get();
此查询获取零条记录,因为图书中的 active 为 0
- 但我想查看所有用户记录以及书中是否有与事件 1 匹配的记录。
- 第二个是查询用户事件 1 或 Null,如果使用
->orwhereNull('active')
所有记录均发生更改。
谢谢
最佳答案
我想您需要对相关记录(with())应用过滤器,而不是对整个查询应用过滤器。因此,这样您将始终获得用户列表以及仅活跃图书列表
User::with(['book'=> function($query) {
$query->where('active', 1);
}])
->where(function ($query) {
$query->where('active', 1)
->orWhereNull('active');
})
->get();
我用过logical grouping此处以防万一您要在查询中添加更多过滤子句。
或者您可以在用户模型中定义一个新关系,以仅选择活跃的相关书籍作为
class User extends Model
{
public function book()
{
return $this->hasMany(Book::class, 'user_id', 'id');
}
public function active_books()
{
return $this->hasMany(Book::class, 'user_id', 'id')
->where('active', '=', 1);
}
}
User::with('active_books')
->where(function ($query) {
$query->where('active', 1)
->orWhereNull('active');
})
->get();
关于laravel Eloquent 查询WhereHas 错误结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66373255/