删除一对多关系中的模型关系并重新定义关系是进行formform更新的最佳方法吗?

时间:2019-07-15 13:58:54

标签: laravel eloquent

我有两个模型,用户和权限。 1个用户可以具有多个权限,一个user_id将在权限表上多次出现。更新用户时,我可以更改其权限。

users         permissions
id            id
name          user_id

我雄辩地做这样的事情:

$user = User::find(1);
$user->permission()->delete();
$user->permission()->create($permissions);

尽管此代码非常合乎逻辑,但对我来说似乎不合适。找到用户,扫描表以删除其权限并重新插入新权限似乎是业余的,删除部分对我而言似乎不合适。为了完成一项任务,我必须经历多个过程。 如果至少是这样的话:

   $user = User::find(1);

  $user->permission()->recreate($permissions);

当然,重新创建必须是内置函数,我愿意对该功能进行编码。不能说是否做对了。

1 个答案:

答案 0 :(得分:0)

确定要严格吗?

由于用户可以拥有许多权限,因此您应该拥有userpermissionsuser_has_permissions或类似useR_permissions的表。

 users   permissions   user_has_permissions
  id         id              user_id
 name       name           permission_id
  ...        ...

这是关系:

用户权限(在用户模型中):

public function permissions()
{
    return $this->belongsToMany(Permission::class, 'user_has_permissions');
}

要检查用户是否具有权限(在用户模型中):

public function hasPermission($permissionId)
{
    return null !== $this->permissions()->where('permission_id', $permissionId)->first();
}

您还可以拥有一个roles表,该表具有许多权限:

 users   permissions   user_has_permissions    roles   role_has_permissions   user_has_role
  id         id              user_id             id         role_id              user_id
 name       name           permission_id        name     permission_id           role_id
  ...        ...                                 ...

现在,用户可以通过角色拥有权限。

用户角色(在用户模型中):

public function roles()
{
     return $this->belongsToMany(Role::class, 'user_has_roles');
}

角色权限(在角色模型中):

public function permissions()
{
    return $this->belongsToMany(Permission::class, 'role_has_permissions');
}

要检查用户是否具有通过角色的权限(在用户模型中):

public function hasPermissionThroughRoles($permissionId)
{
    $roles = $this->roles;
    foreach($roles as $role){
        if($this->roles->contains($permissionId)
             return true;
    }
}

您可以修改hasPermissios函数以检查用户是否具有通过角色的权限,如果是,则授予访问权限:

public function hasPermission($permissionId)
{
    return (bool)($this->permissions()->where('permission_id', $permissionId)->first() || $this->hasPermissionThroughRoles($permissionId));
}

来自laravel docs

  

Eloquent还提供了一些其他的帮助器方法,以使使用相关模型更加方便。例如,假设一个用户可以有多个角色,而一个角色可以有多个用户。要通过在连接模型的中间表中插入一条记录来向用户附加角色,请使用attach方法。

使用提供的代码段,您可以使用以下方式向用户添加权限或角色

$user = User::find(1);
$user->permissions()->attach(1);
$user->roles()->attach(1);

或删除权限/角色:

$user = User::find(1);
$user->permissions()->detach(1);
$user->roles()->detach(1);

选中this package。用户权限和角色(或组,在程序包中称为组)的管理很容易。

希望有帮助。