【问题标题】:How do the "has" and "whereHas" methods work in Eloquent?“has”和“whereHas”方法在 Eloquent 中是如何工作的?
【发布时间】:2019-07-23 17:47:59
【问题描述】:

我定义了用户和权限之间的关系,一个用户可以有很多权限。

当我使用“with”时,我可以正常获取数据。

     $user->with('permisson')->get();

我让用户获得他们的权限。

当我使用“has”时,它只返回用户。

    $user->has('permission')->get();

就我所阅读的内容而言,如果用户包含至少一项权限,我应该获得权限。

我正在使用 Postgres 驱动程序。

【问题讨论】:

    标签: laravel postgresql eloquent


    【解决方案1】:

    with 用于预先加载关系。您可以使用它来获取每个模型(单独或在集合中)的所有指定关系。

    has 用于将关系用作约束或过滤器。正如您所说,使用 has('permission') 之类的内容会在查询中添加一个约束,即“仅获取具有至少一个权限的用户”。这不会自动加载像with() 这样的关系,它只会创建约束。

    如果您想同时利用约束和预先加载结果,您可以将两者结合起来。

    User::has('permission')->with('permission')->get();
    

    似乎有点多余,我知道。

    【讨论】:

      【解决方案2】:

      来自 laravel 文档:

      如果您希望根据关系的存在来限制结果,您应该使用has 方法。例如,如果您想检索至少有一条评论的所有博客文章,您可以将关系名称传递给has 和orHas 方法:

      $posts = Post::has('comments')->get();
      

      因此,当您使用has 方法时,它不会返回关系,而只会返回至少有一条评论的帖子模型。

      whereHas 和 orWhereHas 方法允许您向关系约束添加自定义约束,例如检查评论的内容(使用 laravel 示例):

      $posts = App\Post::whereHas('comments', function (Builder $query) {
          $query->where('content', 'like', 'foo%');
      })->get();
      

      当您使用with 方法时,您正在使用模型加载关系:

      $user->with('permission')->get()
      

      这段代码会加载用户和权限的关系,而这个

      $user->has('permission')->get();
      

      将加载具有某些权限的用户。

      希望对你有帮助。

      【讨论】:

      • 我使用了文档中的语法,但它不起作用,关系没有来。
      • 和User::with('permission')->get()?
      猜你喜欢
      • 2017-05-15
      • 1970-01-01
      • 2018-06-19
      • 2019-07-08
      • 2019-12-28
      • 2021-08-23
      • 1970-01-01
      • 2020-04-23
      • 1970-01-01
      相关资源
      最近更新 更多