【问题标题】:How to design table for nested relation in Laravel?如何在 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');
    }
}

但我需要每个用户都有自己的角色、模块、任务和任务权限。非常感谢任何有关数据库设计或关系设计的建议或指导,谢谢。

【问题讨论】:

    标签: laravel database


    【解决方案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);
        }
    }
       
    

    【讨论】:

      猜你喜欢
      • 2023-02-20
      • 2018-06-03
      • 1970-01-01
      • 2014-10-27
      • 2014-01-08
      • 2021-09-03
      • 2021-05-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多