Laravel8后台更新自身管理员账号时出现邮箱重复SQL错误问题问询
问题根因
你的邮箱验证规则本身逻辑正确,错误出在获取待更新用户实例的代码存在逻辑缺陷:
你通过路由模型绑定已经拿到了对应ID的用户实例$user,无需重复查询,而错误代码行$updatedUser = User::find($user)->first();存在两个问题:
find()方法传入模型实例时虽然会自动取主键查询返回对应模型,但后续调用的first()会发起全新的全表查询,直接返回users表的第一条记录(也就是管理员自身账号)- 最终无论你编辑哪个用户,实际都是在修改管理员账号的字段,提交的邮箱和数据库已存在的邮箱冲突时就会触发唯一约束报错。
修复方案
直接删除错误的查询代码行,使用路由注入的$user实例执行更新即可,修正后代码参考:
public function update(Request $request, User $user) { $edit_user_rules = array( // ... 其他验证规则 ... // 该验证规则无需修改,忽略当前编辑的目标用户ID逻辑正确 'email' => ['required', 'string', 'email', Rule::unique('users')->ignore($user->id)], // ... 其他验证规则 ... ); $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(); } $validated = $validator->validated(); // 直接使用路由注入的$user实例,无需重复查询 $user->username = $validated['username']; $user->email = $validated['email']; // ... 其他用户字段赋值 ... if ($user->save()) { return redirect(route('allUsers')); } else { return redirect(route('allUsers'))->with('failed', '用户更新失败'); } }
补充优化建议
如果需要做权限校验,可以在验证规则前增加判断,确认当前登录用户是否有权限编辑目标用户,避免越权操作。
内容的提问来源于stack exchange,提问作者Suhaib Ahmad
相关产品推荐
相关产品推荐

