public function updateRoles(Request $request, $userId) { /** @var User $user */ $user = User::with('roles')->findOrFail($userId); DB::transaction(function () use($request, $user) { $roleIds = $request->get('role', []); foreach (Role::editable()->get() as $role) { $hasRole = $user->isA($role->name); $shouldHaveRole = array_key_exists($role->id, $roleIds); if ($hasRole && $shouldHaveRole === false) { $user->retract($role); } elseif ($hasRole === false && $shouldHaveRole) { $user->assign($role); } } }); return redirect('/admin/users/' . $userId)->withFlashSuccess('Your changes were saved'); }