Laravel管理员更新用户信息,更新自己的管理员帐户信息时重复电子邮件条目



我正在开发一个laravel 8应用程序,并使用spatiale/laravel permission来获得角色和权限。在管理员页面上,我显示了管理员可以对其进行CRUD操作的所有用户。用户列表还包括他自己的管理员帐户。

我遇到的问题是在更新用户详细信息时。管理员可以通过验证成功更新其他用户的用户帐户信息。然而,如果管理员试图编辑他自己的管理员帐户的信息,验证通过,但我得到一个SQL错误:

完整性约束冲突:1062重复条目'admin@email.com'对于密钥"users_email_unique">

请参阅下面我的UserControllerupdate方法,该方法用于通过验证更新用户信息:

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;的顶部。

最新更新