我有3张桌子:users
; permissions
; user_permissions
。
我的数据透视表(user_permissions
)有两列:user_id和Permission_id。
我将如何使用权限名称或一组权限为用户删除权限?
例如,我可以拥有:
array:1 [
0 => "access_documentation"
]
或者我可以这样:
array:4 [
0 => "general_user"
1 => "access_pagespeed"
2 => "access_documentation"
3 => "access_admin"
]
我与用户权限有关系,该关系返回名称。
public function permissions()
{
return $this->belongsToMany(Permission::class, 'user_permissions');
}
根据以下提供的答案,我拥有什么:
public function save(User $user, Request $request)
{
$params = Permission::query()->whereIn('name', $request->input('data'));
if ($params->count() === 0) {
return;
}
$params = $params->pluck('id')->toArray();
$user->permissions()->detach();
// $user->permissions()->attach(6);
// $user->permissions
}
修改
我的权限分为几类,因此在更新它们时,我仅发送该类别的一组权限,因此执行$user->permissions()->detach()
会分离不相关的权限。
有没有办法说只能分离或同步具有特定类别ID的所有内容?
示例user_permissions
id user_id permission_id
1 32 1
示例permissions
id name category_id
1 edit_users 3
**编辑2 **
$params
返回该类别中的选定权限,因此,根据下面的图像,它将是一个数组[ 'general_user', 'access_pagespeed', 'access_admin' ]
。如果我单击下面列表中的第四项,那么$params
当然就是[ 'general_user', 'access_pagespeed', 'access_admin', 'access_documentation' ]
。
答案 0 :(得分:1)
laravel文档指出,您可以在模型上使用detach方法自动删除数据透视表中的条目:
https://laravel.com/docs/5.8/eloquent-relationships#updating-many-to-many-relationships
因此,在您的代码中,您始终可以通过分离来删除所有权限,然后仅从阵列中读取权限!
答案 1 :(得分:1)
有两种方法可以做到这一点: 选项1:
使用detach
使用此方法将导致用户权限被重置,也就是说,通过将权限的值设置为null,它将从该表中删除用户权限。
更多信息可从以下网站获得: https://laravel.com/docs/5.8/eloquent-relationships#updating-many-to-many-relationships
使用sync
:
使用此方法将删除不属于要发送的阵列的权限,因此您只能使用此方法保留所需的权限,而不是删除所有权限。
假设您的用户具有以下权限ID [1,2,3,4,5,6,7]
考虑以下代码行:
$user->roles()->sync([1, 2, 3]);
这意味着[1,2,3]
的ID将保留在数据透视表中,而其他ID将被删除。
更多信息可从以下网站获得: https://laravel.com/docs/5.8/eloquent-relationships#updating-many-to-many-relationships
由于您只能保留所需的权限,因此我建议您使用sync
。
更新: 根据您对问题的更新,我建议您执行以下操作:
在user_permissions
表中添加其他列,并将其命名为category_id
,此类别ID必须与您的权限相同。
使用此代码$user->permissions()->wherePivot('category_id', 3)->detach();
,这将分离与该类别ID相关的所有权限。
我想这会解决您的问题。