Laravel 在模型属性上创建whare子句

Laravel 在模型属性上创建whare子句,laravel,eloquent,orm,model,relation,Laravel,Eloquent,Orm,Model,Relation,如何在laravel模型属性上创建where子句 我在用户和书籍之间有以下关系。其中,用户拥有许多书籍,而书籍模型属于单个用户 我想选择属于用户\u id=2的所有页数>100的书籍 我将Laravel5.2与mysql结合使用,并为User定义了一个模型,为Book 当我想获取特定用户的所有书籍时,我需要一个用户 return User::find(2)->books; 这个很好用。但是我想买那些页数超过100页的书。我使用: return User::find(2)->book

如何在laravel模型属性上创建
where
子句
我在
用户
书籍
之间有以下关系。其中,用户
拥有许多
书籍,而
书籍
模型属于单个用户
我想
选择属于用户\u id=2的所有页数>100的书籍

我将Laravel5.2与mysql结合使用,并为
User
定义了一个模型,为
Book

当我想获取特定用户的所有书籍时,我需要一个用户

return User::find(2)->books;
这个很好用。但是我想买那些页数超过100页的书。我使用:

return User::find(2)->books->where([['pages', '>', 100], ['chapters', '>', 3]]);
但是不起作用

用户模型:

class User extends Authenticatable
{
    public function books()
    {
        return $this->hasMany('App\Book');
    }
}
图书模型

class Book extends Model
{

  public function user()
  {
    return $this->belongsTo('App\User');
  }
}

我希望获得所有用户id为0且页面>100且章节>3的书籍

您将希望访问关系方法
books()
,而不是属性
books
。文档中的一些引用:

由于所有类型的雄辩关系都是通过方法定义的,因此您可以调用这些方法来获取关系实例,而无需实际执行关系查询。此外,所有类型的有说服力的关系还充当查询生成器,允许您在最终对数据库执行SQL之前,继续将约束链接到关系查询上

如果不需要向雄辩的关系查询添加其他约束,则可以像访问属性一样访问该关系

示例解决方案:

返回用户::查找(2)
->书籍()
->其中([[pages','>',100],[chapters','>',3]])
->get();
请注意,我们正在使用
books()
访问
HasMany
关系,并在其上使用
where()
querybuilder方法来创建约束。然后,为了完成并执行查询,我们在最后调用
get()
。如果没有,只需返回菊花链查询生成器


您以前的代码可能不会出错,因为从
User::find(2)->books
返回的值将是一个集合对象,它实际上有一个
where()
方法。由于您传递的数组格式,它可能没有任何匹配项。

要在相关模型上添加where clouse,我们可以使用
whereHas()
函数

由于您想要书籍,请从
书籍
模型开始

$books=Book::where([
[pages','>',100],
[chapters','>',3],
])
->whereHas('user',函数($query){
$query->where('id',2);
})
->get();