Laravel 8使用updateOrCreate更新数据时出现邮箱已被占用错误如何解决
问题原因
邮箱的unique校验规则默认会检索users表全量记录,更新数据时如果未修改邮箱,当前用户已存在的邮箱记录会触发唯一性冲突。
解决方案
调整Form Request的验证规则,区分新增、更新场景,更新时让unique规则忽略当前待更新的用户ID即可:
public function rules() { // 初始化邮箱基础规则 $emailRule = 'required|string|email|max:255'; // 新增场景校验全表唯一,更新场景排除当前待更新的用户ID $emailRule .= $this->id ? '|unique:users,email,'.$this->id : '|unique:users'; return [ 'name'=>'required|string|min:1|max:60', 'email'=> $emailRule, // 可选优化:仅请求携带password字段时才触发校验,适配更新时不修改密码的场景 'password'=>'sometimes|required|string|min:6', 'password_confirm' => 'sometimes|required|same:password', ]; }
规则说明:unique:users,email,{id}的含义是校验users表email字段唯一性时,忽略id等于当前请求参数id的记录。
可选优化方案
如果业务逻辑明确区分新增和更新场景,也可以单独拆分StoreUserRequest和UpdateUserRequest两个表单请求类,分别编写对应校验规则,代码逻辑会更清晰。
内容的提问来源于stack exchange,提问作者dwi prihta
相关产品推荐
相关产品推荐

