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

如何使用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预加载是分两次查询:

  1. 第一次查询所有角色记录
  2. 第二次根据所有角色的ID,查询关联的权限记录
  3. 自动将权限按角色ID匹配挂载到对应角色对象上,不会出现重复角色,无权限的角色对应permission_id自动为空数组。

内容的提问来源于stack exchange,提问作者mohsin ali

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 00:39:04