Laravel 5.4 唯一验证规则的where语句未按预期生效问题咨询
Laravel 5.4 Unique验证规则不生效问题解决方案
问题根因
- 验证规则中
required_if:is_active,true与请求提交的is_active值为字符串"1"不匹配,导致必填判断逻辑异常 - 闭包内手动写
where('id', '!=', $this->id)的方式无法正确获取到路由参数中的记录ID,排除当前记录的逻辑失效 - 数据库
is_active字段为数字类型(布尔字段对应tinyint),查询时匹配字符串'true'部分环境下会导致查询条件无法命中,unique规则失去限制 - 若实际提交的位置字段名为
order而非position,会导致该验证规则完全没有命中对应字段,直接不生效
修复后代码示例
场景1:在FormRequest类中定义验证规则
public function rules() { // 从路由参数中获取当前要更新的记录ID,路由格式示例:/your-route/{id} $currentId = $this->route('id'); return [ // 若实际提交字段名为order,此处要改为'order' 'position' => [ 'required_if:is_active,1|integer|min:1', \Illuminate\Validation\Rule::unique('tablename') // 用原生ignore方法排除当前记录,第二个参数指定主键字段名 ->ignore($currentId, 'id') ->where(function ($query) { // 直接匹配数字1,适配数据库布尔字段存储格式 $query->where('is_active', 1); }) ], ]; }
场景2:在控制器中直接写验证逻辑
// $currentId 是当前要更新的记录ID,从路由或业务逻辑中获取 $validated = $request->validate([ 'position' => [ 'required_if:is_active,1|integer|min:1', \Illuminate\Validation\Rule::unique('tablename') ->ignore($currentId, 'id') ->where(function ($query) { $query->where('is_active', 1); }) ], ]);
逻辑说明
修复后规则可实现预期效果:当记录is_active为1(启用状态)时,同一个position值只能存在一条记录,更新时会自动排除当前操作的记录本身。
内容的提问来源于stack exchange,提问作者Edmund Woon
相关产品推荐
相关产品推荐

