在 laravel 的多对多关系上调用 $user->roles()->sync($ids),可以让用户的角色集合变成提交的 id 列表。它会添加新角色并移除这次未提交的旧角色。后台应先检查操作者权限,再校验每个角色 id。
把用户和角色声明成多对多关系
示例使用 User、Role 模型和 role_user 中间表。中间表含 user_id、role_id,并建议对两列建联合唯一索引。
// App\Models\User 类中
public function roles(): \Illuminate\Database\Eloquent\Relations\BelongsToMany
{
return $this->belongsToMany(\App\Models\Role::class, 'role_user');
}
如果项目的中间表或键名不同,按迁移文件调整关系定义。
先授权,再按提交列表同步角色
将以下方法放在现有管理控制器。已有的 assignRoles 策略必须允许当前操作者管理目标账号,并在业务要求时限制可分配的角色范围。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
public function updateRoles(
\Illuminate\Http\Request $request,
\App\Models\User $user
): \Illuminate\Http\Response {
\Illuminate\Support\Facades\Gate::authorize('assignRoles', $user);
$data = $request->validate([
'role_ids' => ['present', 'array'],
'role_ids.*' => ['integer', 'distinct', 'exists:roles,id'],
]);
\Illuminate\Support\Facades\DB::transaction(function () use ($user, $data) {
$user->roles()->sync($data['role_ids']);
});
return response()->noContent();
}
缺少 role_ids 时验证失败。空数组是显式清空。如果业务要求至少一个角色,在数组上加入 min:1。
用角色集合变化验证替换与追加
用测试账号设定原角色为 1 和 2,再分别试下面两种调用。两种调用应从相同的初始状态开始。
$user->roles()->sync([2, 3]); // 结果为 2、3。 $user->roles()->sync([1, 2]); // 恢复测试起点 $user->roles()->syncWithoutDetaching([3]); // 结果为 1、2、3。
在测试库重新查询角色 ID,确认替换场景移除了 1,而追加场景保留了 1。还要用无授权账号请求更新接口并验证角色未变化。

















