gpt4 book ai didi

laravel - 多对多关系同步删除所有选定的选项

转载 作者:行者123 更新时间:2023-12-03 23:45:39 26 4
gpt4 key购买 nike

我有一个多对多关系的角色和权限表,以及数据透视表 permission_role .我在尝试更新角色权限时遇到的这个问题。
例如:创建管理员角色时:我添加了权限:view_users到它。现在尝试更新它时,给它额外的权限 create_team .
编码:

$roleUpdate = Role::where('id', $role->id)->update([
'name' => $request->input('name'),
'updated_at' => Carbon::now()
]);

$permissions = $request->input('permission');

//dd($permissions);

foreach ($permissions as $permission) {
$role->permissions()->sync($permission, true);
}

if ($roleUpdate) {
Alert::toast('Role updated successfully', 'success');
return redirect()
->route('roles.index', ['role' => $role->id])
->with('success', 'Role Updated Successfully');
}

//redirect
return back()->withInput();
当我 dd()在查看通过哪些选项的权限后,我得到了预期和正确的结果
array:2 [▼
0 => "3"
1 => "4"
]
但是,当数据保存到数据库中时,只会存储新值并删除旧值。我了解该问题可能是由于在此行上将 detach 设置为 true 引起的:
$role->permissions()->sync($permission,true); 
但是,如果我将其设置为 false,那么当我通过删除其中一项权限来更新角色的权限时,它将不起作用。它不会分离。根据下面链接中的文档中给出的解释,它似乎不起作用。不知道我错过了什么
Laravel Docs

最佳答案

问题是您正在使用 foreach:

array:2 [▼
0 => "3"
1 => "4"
]

foreach ($permissions as $permission) {
$role->permissions()->sync($permission, true);
}
在第一个循环中,您删除角色的所有权限,但 ID 为 3 的权限除外。 ,在第二个循环中,您再次从角色中删除所有权限,但 ID 为 4 的权限除外。 ,这意味着您已经删除了之前设置的 ID 为 3 的权限.
删除 foreach 并传递整个数组应该可以工作:
// no need to pass 'true' as the second argument as it is the default value
$role->permissions()->sync($request->input('permission'));
来自 docs :

You may also use the sync method to construct many-to-manyassociations. The sync method accepts an array of IDs to place on theintermediate table. Any IDs that are not in the given array will beremoved from the intermediate table. So, after this operation iscomplete, only the IDs in the given array will exist in theintermediate table:

$user->roles()->sync([1, 2, 3]);

关于laravel - 多对多关系同步删除所有选定的选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62930291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com