如何在 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 中为嵌套关系设计表?的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 在数据透视表中为克隆字段的一个关系 ID 插入多行

如何在 Laravel 的嵌套 2 级关系中按列排序?

Laravel 如何创建数据透视表?

如何在 Laravel 中加载嵌套关系

如何在 Laravel 中获取嵌套关系的实例?

如何在 Laravel 5 中为表使用全局前缀