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,需修正为以下逻辑:
- 修正Permissions模型关联
// Permissions.php public function category() { return $this->belongsTo(PermissionCategory::class, 'permission_category_id'); }
- 给AdminUsers模型添加分类关联
通过权限中间表,直接关联用户的权限分类及对应权限:
// AdminUsers.php public function permissionCategories() { return $this->belongsToMany(PermissionCategory::class, 'admin_perms', 'admin_users_id', 'permissions_id') ->with('permissions'); }
- 修改控制器逻辑
非管理员用户直接调用新关联获取数据,自动按分类分组:
// 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
相关产品推荐
相关产品推荐

