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

Laravel admin update users' info, duplicate email entry when updating his own admin account information

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

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

Integrity constraint violation: 1062 Duplicate entry 'admin@email.com' for key '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

但 none 有效。所以我使用验证 Rule 来验证唯一的电子邮件字段。当我尝试更新其他用户的信息时它工作正常但我在更新管理员自己的帐户时收到 SQL 重复电子邮件错误。

如果能得到任何帮助,我将不胜感激

您没有确定哪一列应该是唯一的以忽略他自己。

将您的电子邮件验证行更改为:

'email' => ['required', 'email', Rule::unique('users', 'email')->ignore($user->id)],

别忘了把这个赞放在代码的顶部 use Illuminate\Validation\Rule; .

错误正在通过验证规则,但在保存规则时失败。这是因为您没有正确获取用户。 find() 自动获取第一条记录,所以 first() 是不需要的,实际上可能拉错了帐户。当我在本地尝试 User::find(3)->first() 时,我得到的是用户 1 而不是用户 3。从您的呼叫中删除 first()

$updatedUser = User::find($user->id);