如何使用Laravel Eloquent获取全部角色及其关联权限且避免重复
实现方案
方法:使用Eloquent关联预加载(推荐)
你已经定义了Role和Permission的多对多关联,直接用Eloquent提供的with()预加载方法即可,完全避免左连接导致的角色重复问题,查询性能也更优:
基础查询代码
// 预加载权限关联,自动将对应权限挂载到角色对象上,无权限的角色关联为空集合 $roles = Role::with('permissions')->get();
格式转换为需求结构
如果需要直接输出['role_id' => 1, 'permission_id' => [1,2]]的格式,可以借助集合的map方法做转换:
$formattedRoles = Role::with('permissions:id') // 仅查询权限ID字段,优化查询性能 ->get() ->map(function ($role) { return [ 'role_id' => $role->id, 'permission_id' => $role->permissions->pluck('id')->toArray() ]; })->toArray();
原查询问题说明
你之前用左连接的方式会返回重复角色,是因为左连接会为每个角色+权限的匹配项返回独立的行,一个角色有N个权限就会返回N条重复的角色记录,不符合需求。而Eloquent预加载是分两次查询:
- 第一次查询所有角色记录
- 第二次根据所有角色的ID,查询关联的权限记录
- 自动将权限按角色ID匹配挂载到对应角色对象上,不会出现重复角色,无权限的角色对应
permission_id自动为空数组。
内容的提问来源于stack exchange,提问作者mohsin ali
相关产品推荐
相关产品推荐

