You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 00:24:05