我有两个模型,用户和权限。 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);
当然,重新创建必须是内置函数,我愿意对该功能进行编码。不能说是否做对了。
答案 0 :(得分:0)
确定要严格吗?
由于用户可以拥有许多权限,因此您应该拥有user
,permissions
和user_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。用户权限和角色(或组,在程序包中称为组)的管理很容易。
希望有帮助。