如何在 Laravel 中为嵌套关系设计表?
Posted
技术标签:
【中文标题】如何在 Laravel 中为嵌套关系设计表?【英文标题】:How to design table for nested relation in Laravel? 【发布时间】:2022-01-06 20:38:21 【问题描述】:我的角色和权限如下表所示。
role table
user_id | role_id
1 | 1
1 | 2
role module table
role_id | module_id
1 | 1
1 | 2
module task table
module_id taks_id
1 | 1
1 | 2
task permission table
task_id permission
1 | [true,true,true,false]
1 | [true,false,false,false]
role_module 和 module_taks 之间有如下关系
class Role extends Model
use HasFactory;
public function modules()
return $this->belongsToMany(Module::class, 'role_modules');
模块任务
class Module extends Model
use HasFactory;
public function tasks()
return $this->belongsToMany(Task::class, 'module_tasks');
但我需要每个用户都有自己的角色、模块、任务和任务权限。非常感谢任何有关数据库设计或关系设计的建议或指导,谢谢。
【问题讨论】:
【参考方案1】:如果我对这一点的理解正确,除了上述内容之外,您还需要能够赋予特定用户角色、模块、任务和任务权限。
有几种方法可以解决这个问题,我很确定有一些软件包可以帮助您快速设置。但是,如果您想在内部开发它,那么我建议您使用Morphpivot 进行以下操作。
user table
id | name
1 | John
2 | Jane
role table
id | name
1 | user
2 | admin
permission table
id | name
1 | ReadOnly
2 | Manage
permissionable morph pivot table
permission_id | permissionable_id | permissionable_type
1 | 1 | App\Models\Role
1 | 1 | App\Models\Role
2 | 2 | App\Models\Role
2 | 1 | App\Models\User
然后你可以对模块和任务做同样的事情。这将允许您为任何类型的模型分配任何权限,从而使您的数据库更好,并且在您将来添加新事物时大大减少开发时间。
use Illuminate\Database\Eloquent\Relations\MorphPivot;
class Permissionable Pivot extends MorphPivot
protected $table = 'permissionable';
public $incrementing = true;
class Role extends Model
use HasFactory;
public function permissions()
return $this->morphToMany('App\Models\Permission', 'permissionable')
->using(Permissionable Pivot::class);
【讨论】:
以上是关于如何在 Laravel 中为嵌套关系设计表?的主要内容,如果未能解决你的问题,请参考以下文章