如何在laravel模型属性上创建where
子句我在user
和books
之间具有以下关系。用户hasMany
预订并且book
模型属于单个用户我想select all books with pages > 100 that belongs to user_id = 2
我将laravel 5.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');
}
}
我希望获得所有user_id = 0且页面> 100和章节> 3的书籍
您将要访问关系方法books()
,而不是属性books
。文档中的一些引号:
由于所有类型的口才关系都是通过方法定义的,因此您可以调用这些方法来获取关系的实例,而无需实际执行关系查询。此外,所有类型的口才关系也可以用作查询构建器,从而使您可以继续将约束链链接到关系查询上,最后对数据库执行SQL。
Relationship Methods Vs. Dynamic Properties
如果不需要在雄辩的关系查询中添加其他约束,则可以像对待关系一样访问该关系。
示例解决方案:
return User::find(2)
->books()
->where([['pages', '>', 100], ['chapters', '>', 3]])
->get();
请注意,我们正在使用books()
访问HasMany
关系,并在其上使用where()
查询构建器方法创建约束。然后,为了完成并执行查询,我们在末尾调用get()
。如果不这样做,您将只返回菊花链查询构建器。
您的先前代码可能不会出错,因为从User::find(2)->books
返回的值将是一个Collection对象,该对象实际上具有where()
方法。由于您传递的数组格式,很可能没有任何匹配项。
要在相关模型上添加Clouse,我们可以使用whereHas()
函数。
由于需要书籍,请从Book
模型开始。
$books = Book::where([
['pages', '>', 100],
['chapters', '>', 3],
])
->whereHas('user', function($query) {
$query->where('id', 2);
})
->get();