如何在Laravel Form Request Validation中更新邮箱时让unique规则跳过当前用户
解决方案
你只需要在unique验证规则中指定需要排除的当前用户ID即可,Laravel的唯一性验证规则原生支持忽略指定ID的记录,修改方式如下:
- 修改
UsersRequest表单验证类代码,推荐使用Rule类写法(可读性更高):
namespace App\Http\Requests; use Illuminate\Foundation\Http\FormRequest; use Illuminate\Validation\Rule; // 新增引入Rule类 class UsersRequest extends FormRequest { public function rules() { return [ 'email' => ['sometimes', 'required','email:rfc,dns', // 替换原有unique:users,email规则 Rule::unique('users', 'email')->ignore($this->route('id')), 'max:255'], // 其余验证规则保持不变 ]; } }
如果偏好字符串格式的规则写法,也可以直接改写成:
'email' => ['sometimes', 'required','email:rfc,dns', 'unique:users,email,'.$this->route('id'), 'max:255'],
实现说明
验证时会自动跳过users表中ID等于路由参数id(也就是你当前要更新的用户ID)的记录,当用户提交的邮箱和自身原有邮箱一致时,就不会触发邮箱已占用的报错。
注意事项
如果你的路由参数名不是id,或者用户表主键字段不是id,需要对应调整参数:
- 路由参数名改为实际的参数名,比如路由参数是
user就改成$this->route('user') - 如果主键是自定义字段比如
user_id,用Rule写法时可以指定第二个参数:Rule::unique('users', 'email')->ignore($this->route('id'), 'user_id')
内容的提问来源于stack exchange,提问作者Shady Hesham
相关产品推荐
相关产品推荐

