Laravel多对多关联权限如何按指定company_id过滤查询
实现思路
- 方案1:预加载时动态过滤关联(无需修改现有关联定义,适合单次使用场景)
你只需要给with()方法传入闭包,对关联的权限查询增加中间表company_id的匹配条件即可,修改控制器代码如下:
public function show($company_id, $user_id) { return User::with(['permissions' => function ($query) use ($company_id) { // 用wherePivot专门查询多对多关联的中间表字段 $query->wherePivot('company_id', $company_id); }])->find($user_id); }
注意:原有代码里find($User_id)变量名大小写和参数不匹配,要修正为小写$user_id;同时确认中间表名和关联定义的user_has_permission一致,和表结构标注的User_has_permissions复数形式要统一,避免查询报错。如果找不到用户时需要返回404,可把find替换为findOrFail。
- 方案2:新增独立关联方法(适合多处需要按公司查权限的场景,复用性更高)
先在User模型中新增专门按公司筛选的权限关联:
public function permissionsByCompany() { return $this->belongsToMany(Permission::class, 'user_has_permission', 'user_id', 'permission_id') ->wherePivot('company_id', request()->get('company_id')); // 可选追加withPivot('company_id'),返回权限时会携带关联的公司ID字段 }
控制器直接调用即可:
public function show($company_id, $user_id) { return User::with('permissionsByCompany')->find($user_id); }
内容的提问来源于stack exchange,提问作者Michel Silva
相关产品推荐
相关产品推荐

