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

Laravel中合并同分类权限数据的实现方法咨询

权限分类数据去重合并方案

当前获取的权限分类数据存在重复分类条目,每个条目对应单个权限,需要转换为同一分类下包含多个权限的结构,避免foreach输出时重复显示分类名称。已基于Laravel建立4张表关联,现有控制器、资源类、模型代码及数据表结构,需要确定是修改模型关联逻辑还是通过PHP数组函数处理输出,寻求可行实现方案。

当前数据结构

"permission_category": [{
        "id": 2,
        "name": "user",
        "permissions": {
            "id": 2,
            "name": "userCreate"
        }
    },
    {
        "id": 2,
        "name": "user",
        "permissions": {
            "id": 3,
            "name": "userUpdate"
        }
    }
]

期望数据结构

"permission_category": [{
        "id": 2,
        "name": "user",
        "permissions": [
            {
              "id": 2,
              "name": "userCreate"
            },
            {
              "id": 3,
              "name": "userUpdate"
            }
        ]
    }
]

现有相关代码与数据表结构

控制器代码(UsersController.php)

public function add() {
        $data = array();
        $user = AdminUsers::where('id', $this->uid())->first();
        if($user->hasAdministrator()->first())
            $data['permission_category'] = PermissionCategory::with('permissions')->get();
        else
            $data['permission_category'] = PermissionsResource::collection($user->permissions()->with('category')->get());
        return $data;
        die();
        return view('admin.users.add', $data);
    }

资源类代码(PermissionsResource.php)

return [
            "id" => $this->category[0]->id,
            "name" => $this->category[0]->name,
            "permissions" => [
                "id" => $this->id,
                "name" => $this->name
            ],
        ];

模型代码

AdminUsers.php

public function permissions() {
        return $this->belongsToMany(Permissions::class, 'admin_perms');
    }

Permissions.php

public function category() {
        return $this->belongsToMany(PermissionCategory::class, 'permissions', 'id');
    }

数据表结构

  • admin_users表
    -id
    -username
    
  • permission_category表
    -id
    -name
    
  • permissions表
    -id
    -permission_category_id
    -name
    
  • admin_perms表
    -id
    -admin_users_id foreign key
    -permissions_id foreign key
    

可行实现方案

方案一:优化模型关联逻辑(推荐)

从数据表结构看,permissions表有permission_category_id外键,说明权限和分类是一对多关系(一个分类对应多个权限),但现有Permissions模型的category关联错误使用了多对多的belongsToMany,需修正为以下逻辑:

  1. 修正Permissions模型关联
// Permissions.php
public function category() {
    return $this->belongsTo(PermissionCategory::class, 'permission_category_id');
}
  1. 给AdminUsers模型添加分类关联
    通过权限中间表,直接关联用户的权限分类及对应权限:
// AdminUsers.php
public function permissionCategories() {
    return $this->belongsToMany(PermissionCategory::class, 'admin_perms', 'admin_users_id', 'permissions_id')
                ->with('permissions');
}
  1. 修改控制器逻辑
    非管理员用户直接调用新关联获取数据,自动按分类分组:
// UsersController.php
public function add() {
    $data = [];
    $user = AdminUsers::where('id', $this->uid())->first();
    
    if($user->hasAdministrator()->first()){
        $data['permission_category'] = PermissionCategory::with('permissions')->get();
    } else {
        $data['permission_category'] = $user->permissionCategories()->get();
    }
    
    return view('admin.users.add', $data);
}

方案二:通过PHP数组函数处理现有数据

如果暂时不想修改模型关联,可以在控制器中对现有返回数据进行分组合并:

// UsersController.php
public function add() {
    $data = [];
    $user = AdminUsers::where('id', $this->uid())->first();
    
    if($user->hasAdministrator()->first()){
        $data['permission_category'] = PermissionCategory::with('permissions')->get();
    } else {
        // 获取原始资源数据
        $rawData = PermissionsResource::collection($user->permissions()->with('category')->get())->toArray(request());
        
        // 按分类ID分组并重组结构
        $groupedData = collect($rawData)->groupBy('id')->map(function($items) {
            $category = $items[0];
            return [
                'id' => $category['id'],
                'name' => $category['name'],
                'permissions' => $items->pluck('permissions')->toArray()
            ];
        })->values()->toArray();
        
        $data['permission_category'] = $groupedData;
    }
    
    return view('admin.users.add', $data);
}

内容的提问来源于stack exchange,提问作者Huseyin Telli

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:40:44