Laravel邮箱更新验证异常求助:ID/PRN/RFID正常仅邮箱出错
解决Laravel用户邮箱更新时的验证异常问题
嘿,我一眼就瞅出你验证规则里的问题啦!问题出在unique规则的参数用法上。
Laravel的unique验证规则,第三个参数应该是要排除的记录ID,用来告诉验证器:“忽略这条ID对应的记录的唯一性检查”。而你现在对email字段用的是$user->email,这就完全搞错了参数类型!
错误原因分析
你当前的邮箱验证规则:
'email' => 'required|email|unique:users,email,'.$user->email,
这里你把用户当前的邮箱值传给了unique规则的排除参数,这会导致两种异常情况:
- 当用户没修改邮箱时,验证器会扫描整个
users表,发现有一条记录的邮箱是当前值(就是用户自己的那条),就会报错“邮箱已存在”,这显然不符合需求——用户只是没改邮箱而已,应该允许通过。 - 只有当用户输入一个数据库里完全不存在的邮箱时,验证才会通过,这就是你说的“输入不存在的邮箱时正常工作”的原因,但这只是巧合。
修正后的验证代码
把所有unique规则的第三个参数都改成当前用户的ID$user->id,这才是正确的用法:
$validate = $request->validate([ 'id' => 'required|numeric|unique:users,id,'.$user->id, 'email' => 'required|email|unique:users,email,'.$user->id, 'prn' => 'required|numeric|unique:users,prn,'.$user->id, 'rfid_number' => 'required|numeric|unique:users,rfid_number,'.$user->id ]);
额外提醒
其实你其他字段(prn、rfid_number)的验证规则写法也有问题,只是可能你测试时没触发异常而已。比如如果用户没改prn,用原来的$user->prn作为排除参数,同样会出现“prn已存在”的错误。改成用用户ID来排除当前记录,就能彻底解决这类更新时的唯一性验证问题。
内容的提问来源于stack exchange,提问作者drdrdrdrdr2
相关产品推荐
相关产品推荐

