如何在Laravel集合中提取嵌套的权限ID一维数组
Laravel 8 获取指定用户所有权限ID的解决方案
你当前的查询思路本身是可行的,预加载角色、权限关联的逻辑没有问题,只需要对返回的关联数据做集合处理即可拿到目标数组,也可以选择更高效的直接关联查询方案减少不必要的数据加载。
方案1:基于现有查询逻辑调整
在原有预加载逻辑的基础上,通过Laravel集合的链式操作直接提取权限ID:
$permissionIds = User::with(['roles.permissions']) ->find(21) ->roles ->pluck('permissions') // 提取所有角色下的权限集合 ->flatten() // 把二维权限集合拍平为一维权限集合 ->pluck('id') // 提取所有权限的id字段 ->toArray();
如果存在不同角色分配了相同权限的场景,可以在转数组前调用unique()方法去重:
$permissionIds = User::with(['roles.permissions']) ->find(21) ->roles ->pluck('permissions') ->flatten() ->pluck('id') ->unique() ->values() ->toArray();
方案2:更高效的直接关联查询
不需要加载用户、角色、权限的其他冗余字段,直接通过关联嵌套查询从权限表拿到目标ID,性能更优:
$permissionIds = Permission::whereHas('roles', function ($roleQuery) { $roleQuery->whereHas('users', function ($userQuery) { $userQuery->where('id', 21); }); })->pluck('id')->toArray();
同样需要去重的话加上unique()->values()即可。
内容的提问来源于stack exchange,提问作者Marc Wampfler
相关产品推荐
相关产品推荐

