Laravel验证规则实现:两字段全为空时报错,单空则另一字段必填
原规则失效原因
required_if的触发前提是「被依赖的字段在请求中存在且等于指定值」,如果两个字段都没有传入请求,两个required_if的触发条件都不满足,自然不会触发必填校验,也就不会返回错误。
正确实现方案
直接使用Laravel内置的required_without验证规则即可,该规则语义为:当指定的其他字段不存在或为空时,当前字段为必填项,完全匹配你的需求。
规则写法如下:
$rules = [ 'inventory_storage_container_id' => 'required_without:inventory_storage_space_id|integer|exists:inventory_storage_containers,id', 'inventory_storage_space_id' => 'required_without:inventory_storage_container_id|integer|exists:inventory_storage_spaces,id', ];
规则校验效果
- 仅传入
inventory_storage_container_id:inventory_storage_space_id的required_without条件不满足,验证通过 - 仅传入
inventory_storage_space_id:inventory_storage_container_id的required_without条件不满足,验证通过 - 同时传入两个字段:两个规则都不触发,验证通过
- 两个字段都未传入/都为空:两个字段的
required_without条件同时触发,返回必填错误,符合预期
如果需要自定义错误提示,可以参考如下写法:
$messages = [ 'inventory_storage_container_id.required_without' => '未选择存储位时必须选择存储容器', 'inventory_storage_space_id.required_without' => '未选择存储容器时必须选择存储位', ]; // 验证调用示例 $validator = Validator::make($request->all(), $rules, $messages);
内容的提问来源于stack exchange,提问作者Majid Javaid
相关产品推荐
相关产品推荐

