【问题标题】:create whare clause on model attribute在模型属性上创建 where 子句
【发布时间】:2019-09-28 23:10:55
【问题描述】:

如何在 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


    【解决方案1】:

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

    Querying Relations

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

    Relationship Methods Vs. Dynamic Properties

    如果您不需要为 Eloquent 关系查询添加额外的约束,您可以像访问属性一样访问该关系。

    示例解决方案:

    return User::find(2)
        ->books()
        ->where([['pages', '>', 100], ['chapters', '>', 3]])
        ->get();
    

    请注意,我们使用books() 访问HasMany 关系,并在其上使用where() 查询构建器方法来创建约束。然后,为了完成并执行查询,我们在最后调用get()。如果不这样做,您将只返回菊花链查询构建器。

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

    【讨论】:

      【解决方案2】:

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

      既然你想要书籍,就从Book模型开始。

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-12-03
        • 2012-12-24
        相关资源
        最近更新 更多