【问题标题】:Eloquent: How to combine eager loading and filter by pivot?Eloquent:如何结合预加载和枢轴过滤?
【发布时间】:2018-01-19 08:01:33
【问题描述】:

模型之间存在多对多关系。对于给定的模型实例,我知道如何根据枢轴的值过滤相关模型。例如,对于用户和角色,我会使用:

User->roles()->wherePivot('admin',1);

同样,我知道如何为一组用户预先加载所有角色:

User::where('active',1)->with('roles')->get();

我想做的是将这两个概念结合起来。例如,如何检索一组具有急切加载角色的用户,并根据数据透视表上的字段过滤用户?

我意识到使用原始 SQL 可以很容易地做到这一点,但如果可能的话,我更愿意使用 Eloquent。

【问题讨论】:

    标签: laravel eloquent


    【解决方案1】:

    您可以使用闭包来限制您急切加载的关系。

    $users = User::with(['roles' => function ($query) {
            return $query->wherePivot('admin', 1);
        }])
        ->where('active', 1)
        ->get();
    

    您也可以使用whereHas查询关系。

    $users = User::with('roles')
        ->whereHas('roles', function ($query) {
            return $query->wherePivot('admin', 1);
        })
        ->where('active', 1)
        ->get();
    

    【讨论】:

      【解决方案2】:

      在急切加载时将闭包传递给 with 以向查询中添加子句:

              User::with(['roles' => function ($query) {
                  $query->where('admin', 1);
              }])->where('active', 1)->get();
      

      【讨论】:

        猜你喜欢
        • 2012-05-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-09
        • 2014-10-09
        • 1970-01-01
        • 2021-10-13
        • 1970-01-01
        相关资源
        最近更新 更多