Laravel关联问题:无法通过父表获取子表数据,求选型及结构指导
嘿,我来帮你理清楚Laravel关联关系的问题!根据你提供的结构,这是一套经典的RBAC权限体系,包含用户表、角色表、权限表,用户和角色、角色和权限之间都是多对多的关联关系,下面给你一套完整的基础结构方案:
一、关联类型确定
咱们先把每个关联关系说清楚:
- 用户 ↔ 角色:多对多关联(一个用户可以拥有多个角色,一个角色可以分配给多个用户),需要中间表存储两者的关联记录
- 角色 ↔ 权限:多对多关联(一个角色可以拥有多个权限,一个权限可以分配给多个角色),同样需要中间表来关联
二、迁移文件设置
下面是各个表的迁移代码示例,你可以生成对应迁移文件后替换内容:
1. 角色表(roles)迁移
Schema::create('roles', function (Blueprint $table) { $table->id(); $table->string('name')->unique(); // 角色名称,比如"管理员" $table->string('slug')->unique(); // 角色标识,比如"admin",用于权限判断 $table->text('description')->nullable(); // 角色描述 $table->timestamps(); });
2. 权限表(permissions)迁移
Schema::create('permissions', function (Blueprint $table) { $table->id(); $table->string('name')->unique(); // 权限名称,比如"编辑文章" $table->string('slug')->unique(); // 权限标识,比如"article.edit" $table->text('description')->nullable(); // 权限描述 $table->timestamps(); });
3. 用户-角色中间表(user_role)迁移
Schema::create('user_role', function (Blueprint $table) { $table->foreignId('user_id')->constrained()->onDelete('cascade'); $table->foreignId('role_id')->constrained()->onDelete('cascade'); $table->primary(['user_id', 'role_id']); // 联合主键,避免重复关联 });
4. 角色-权限中间表(role_permission)迁移
Schema::create('role_permission', function (Blueprint $table) { $table->foreignId('role_id')->constrained()->onDelete('cascade'); $table->foreignId('permission_id')->constrained()->onDelete('cascade'); $table->primary(['role_id', 'permission_id']); // 联合主键 });
注:用户表(users)用Laravel默认生成的即可,如果需要额外字段可以自行添加
三、模型结构设置
接下来是各个模型的关联方法,直接在对应模型里添加即可:
1. User模型
namespace App\Models; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class User extends Authenticatable { // ... 其他默认代码 // 用户关联角色 public function roles(): BelongsToMany { return $this->belongsToMany(Role::class, 'user_role'); } // 快捷方法:判断用户是否拥有某个角色 public function hasRole(string $slug): bool { return $this->roles()->where('slug', $slug)->exists(); } // 快捷方法:获取用户的所有权限 public function permissions() { return $this->roles()->with('permissions')->get()->pluck('permissions')->flatten()->unique(); } }
2. Role模型
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class Role extends Model { // ... 其他默认代码 // 角色关联用户 public function users(): BelongsToMany { return $this->belongsToMany(User::class, 'user_role'); } // 角色关联权限 public function permissions(): BelongsToMany { return $this->belongsToMany(Permission::class, 'role_permission'); } }
3. Permission模型
namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Relations\BelongsToMany; class Permission extends Model { // ... 其他默认代码 // 权限关联角色 public function roles(): BelongsToMany { return $this->belongsToMany(Role::class, 'role_permission'); } }
这样一套基础的RBAC权限体系就搭建好了,你可以根据自己的业务需求再扩展字段或者方法~
内容的提问来源于stack exchange,提问作者user9611583
相关产品推荐
相关产品推荐

