laravel Eloquent 查询WhereHas 错误结果

标签 laravel eloquent

我有两个表和关系如下 用户 用户表:

<表类=“s-表”> <标题> id 姓名 活跃 <正文> 1 abc 1 2 xyz 空 3 abx 0

图书表:

<表类=“s-表”> <标题> id user_id 姓名 活跃 <正文> 1 1 书1 0 2 2 书2 0 3 1 书3 0

关系是这样的 用户->书籍(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 匹配的记录。
  2. 第二个是查询用户事件 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/

相关文章:

php - laravel 5.6菜单表如何链接不同的页面部分

php - Laravel 反向插入数据透视表查询

php - 如何优化具有外键的 Eloquent 查询

php - Laravel Lumen 确保 JSON 响应

mysql - 在mysql中实现多对多关系

php - 查询在 laravel 中返​​回错误的输出结果

php - Laravel 嵌套急切加载

php - laravel 数据库种子在 easyPHP 中失败

php - Laravel 中的自定义查询

laravel - Vue组件扩展布局时找不到#app