我正在开发一个laravel 8应用程序,并使用spatiale/laravel permission来获得角色和权限。在管理员页面上,我显示了管理员可以对其进行CRUD操作的所有用户。用户列表还包括他自己的管理员帐户。
我遇到的问题是在更新用户详细信息时。管理员可以通过验证成功更新其他用户的用户帐户信息。然而,如果管理员试图编辑他自己的管理员帐户的信息,验证通过,但我得到一个SQL错误:
完整性约束冲突:1062重复条目'admin@email.com'对于密钥"users_email_unique">
请参阅下面我的UserController
update
方法,该方法用于通过验证更新用户信息:
public function update(Request $request, User $user)
{
$edit_user_rules = array(
// ... other validation rules ...
//'email' => "required|email|unique:users,email,{{$user->id}}", //. auth()->user()->id,
'email' => ['required', 'string', 'email', Rule::unique('users')->ignore($user->id)],
// ... other validation rules ...
);
$validator = Validator::make($request->all(), $edit_user_rules);
if ($validator->fails()) {
Session::flash('failed', 'Failed to save User details!');
return redirect(route('editUser', ['user' => $user->id]))->withErrors($validator)->withInput();
} else {
$validated = $validator->validated();
$updatedUser = User::find($user)->first();
// ... other user fields ...
$updatedUser->username = $validated['username'];
$updatedUser->email = $validated['email'];
// ... other user fields ...
if ($updatedUser->save()) {
return redirect(route('allUsers'));
} else {
return redirect(route('allUsers')); // with errors
}
}
}
我尝试在email
字段上使用不同的验证规则,例如
"required|email|unique:users,email,{{$user->id}}"
"required|email|unique:users,email," . auth()->user()->id
但都没有奏效。因此,我使用验证Rule
来验证唯一的电子邮件字段。当我尝试更新其他用户的信息时,它运行良好,但在更新管理员自己的帐户时,我收到了SQL重复电子邮件错误。
如果我能得到,我将不胜感激
错误通过了验证规则,但在保存规则时失败了。这是因为您没有正确获取用户。find()
会自动获得第一条记录,因此first()
是不需要的,而且实际上可能拉错了账户。当我在本地尝试User::find(3)->first()
时,我得到的是用户1,而不是用户3。从通话中删除first()
。
$updatedUser = User::find($user->id);
您没有确定哪一列应该是唯一的以忽略他自己。
将您的电子邮件验证行更改为:
'email' => ['required', 'email', Rule::unique('users', 'email')->ignore($user->id)],
不要忘记将这个like放在代码use IlluminateValidationRule;
的顶部。