Laravel 雄辩的:如何将快速加载和pivot过滤结合起来?

Laravel 雄辩的:如何将快速加载和pivot过滤结合起来?,laravel,eloquent,Laravel,Eloquent,我在模型之间有一种多对多的关系。对于给定的模型实例,我知道如何根据pivot的值过滤相关模型。例如,对于用户和角色,我将使用: User->roles()->wherePivot('admin',1); 同样,我知道如何为一组用户加载所有角色: User::where('active',1)->with('roles')->get(); 我想把这两个概念结合起来。例如,我如何检索一组用户及其急切加载的角色,其中用户根据pivot上的字段进行筛选 我意识到我可以用原始S

我在模型之间有一种多对多的关系。对于给定的模型实例,我知道如何根据pivot的值过滤相关模型。例如,对于用户和角色,我将使用:

User->roles()->wherePivot('admin',1);
同样,我知道如何为一组用户加载所有角色:

User::where('active',1)->with('roles')->get();
我想把这两个概念结合起来。例如,我如何检索一组用户及其急切加载的角色,其中用户根据pivot上的字段进行筛选


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

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

$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();

您可以使用闭包限制您的关系

$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();

当要向查询中添加子句时,将闭包传递到:

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

当要向查询中添加子句时,将闭包传递到:

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