如何在两个数据库表的验证规则中忽略字段自身值
解决方案
你的问题出在仅给vendors表的unique规则添加了当前记录的排除ID,但admins表的规则没有做同样处理。当编辑现有记录时,unique:admins会检查整个表,发现当前email已经存在(就是你正在编辑的这条记录),因此触发重复错误。
针对不同场景的验证规则写法
1. 创建新记录(Admin或Vendor)
此时需要确保email在两个表中都完全不存在:
// 创建Admin时的规则 $rules = [ 'email' => 'required|unique:admins|unique:vendors', ]; // 创建Vendor时的规则(逻辑完全一致) $rules = [ 'email' => 'required|unique:admins|unique:vendors', ];
2. 编辑现有Admin记录
需要排除当前Admin的记录,同时确保该email未出现在vendors表中:
use Illuminate\Validation\Rule; // 假设$admin是当前要编辑的Admin模型实例 $rules = [ 'email' => [ 'required', Rule::unique('admins')->ignore($admin->id), Rule::unique('vendors'), ], ];
3. 编辑现有Vendor记录
需要排除当前Vendor的记录,同时确保该email未出现在admins表中:
use Illuminate\Validation\Rule; // 假设$vendor是当前要编辑的Vendor模型实例 $rules = [ 'email' => [ 'required', Rule::unique('admins'), Rule::unique('vendors')->ignore($vendor->id), ], ];
4. 通用场景(兼容Admin/Vendor编辑)
如果你的控制器需要同时处理两种模型的编辑,可以通过 instanceof 判断动态设置规则:
use Illuminate\Validation\Rule; use App\Models\Admin; use App\Models\Vendor; // $model 是当前的Admin或Vendor实例 $rules = [ 'email' => [ 'required', Rule::unique('admins')->ignore($model instanceof Admin ? $model->id : null), Rule::unique('vendors')->ignore($model instanceof Vendor ? $model->id : null), ], ];
关键说明
Rule::unique()->ignore($id)会告诉验证器:忽略表中ID为$id的记录,避免把当前编辑的自身记录判定为重复。- 如果你的表主键不是默认的
id,可以在ignore()方法后追加主键字段名,比如:Rule::unique('admins')->ignore($admin->uuid, 'uuid')
内容的提问来源于stack exchange,提问作者Orkhan Orkhan
相关产品推荐
相关产品推荐

