在模型属性上创建whare子句

问题描述 投票:0回答:2

如何在laravel模型属性上创建where子句我在userbooks之间具有以下关系。用户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的书籍

laravel eloquent orm model relation
2个回答
0
投票

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

Querying Relations

由于所有类型的口才关系都是通过方法定义的,因此您可以调用这些方法来获取关系的实例,而无需实际执行关系查询。此外,所有类型的口才关系也可以用作查询构建器,从而使您可以继续将约束链链接到关系查询上,最后对数据库执行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()方法。由于您传递的数组格式,很可能没有任何匹配项。


0
投票

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

由于需要书籍,请从Book模型开始。

$books = Book::where([
    ['pages', '>', 100],
    ['chapters', '>', 3],
])
->whereHas('user', function($query) {
    $query->where('id', 2);
})
->get();
© www.soinside.com 2019 - 2024. All rights reserved.