我们正在尝试验证一个或另一个字段,仅当他们选择不填写第一个字段时,第二个字段才会显示。因此,我们只需要第二个字段来验证第一个字段是否被跳过而没有留空。
为了便于查看设备的制造商,我们提供了系统已知的品牌/制造商列表,但是如果您的产品没有出现,可以选择手动编写。但是,我们需要验证手动输入字段是否为空,仅当它们已跳过第一个列表时才如此。
'single_item_make' => 'required_if:policy_type,single|required_if:single_item_make_other,',
'single_item_make_other' => 'required_if:policy_type,single|required_if:single_item_make,'
我们尝试了上述操作,但没有成功,我们似乎无法在文档中找到任何有关检查字段是否为空的内容。
这两个字段只能一次提交。
答案 0 :(得分:1)
在这种情况下,您无法将required_if
与required_without
合并,因为它们会冲突。
在当前代码中,两者的第一个规则是:
required_if:policy_type,single
如果policy_type === 'single'
,则需要两个字段;如果其中一个字段为空,则验证将失败。
一种解决方案可能是使用复杂的条件验证,如下所示:
$v = Validator::make($data, [
'policy_type' => [
'required',
'in:single,x,y', // ?
],
// some other static validation rules you have
]);
// conditional validation based on policy_type === 'single';
$v->sometimes('single_item_make', 'required_without:single_item_make_other', function ($input) {
return $input->policy_type === 'single';
});
$v->sometimes('single_item_make_other', 'required_without:single_item_make', function ($input) {
return $input->policy_type === 'single';
});
这只会检查两个字段不能同时为空,而另一个字段为空时需要一个字段。
但是,这将使用户可以同时填写两个选项。
如果您想验证两者不能为空,但是一次只能设置1(异或),则必须扩展验证器,因为Laravel中不存在此验证器。
将其放入您的AppServiceProvider的boot()
方法中:
Validator::extendImplicit('xor', function ($attribute, $value, $parameters, $validator) {
return empty($value) || empty(data_get($validator->getData(), $parameters[0]));
});
然后您可以使用:
$v->sometimes('single_item_make', 'required_without:single_item_make_other|xor:single_item_make_other', function ($input) {
return $input->policy_type === 'single';
});
$v->sometimes('single_item_make_other', 'required_without:single_item_make|xor:single_item_make', function ($input) {
return $input->policy_type === 'single';
});
在这种情况下,required_without
确保如果1为空,则需要其他1;而xor
验证确保,如果设置为1,则其他1不能具有值。 / p>
您可以在验证中添加自定义错误消息,也可以使用自定义验证器,然后在其中传递这些验证消息。
更多信息:https://laravel.com/docs/5.7/validation#conditionally-adding-rules
我还没有测试这两个代码,但是它们应该都可以工作。
答案 1 :(得分:0)
根据required_without文档的建议,您需要按以下方式使用它:
'single_item_make' => 'required_if:policy_type,single|required_without:single_item_make_other,',
'single_item_make_other' => 'required_if:policy_type,single|required_without:single_item_make,'