雄辩地,从数据透视表中删除用户权限

时间:2019-05-07 09:03:52

标签: php eloquent

我有3张桌子:userspermissions; 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' ]

enter image description here

2 个答案:

答案 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相关的所有权限。

我想这会解决您的问题。