验证检查字段不为空

时间:2019-03-01 12:11:39

标签: laravel laravel-5.3

我们正在尝试验证一个或另一个字段,仅当他们选择不填写第一个字段时,第二个字段才会显示。因此,我们只需要第二个字段来验证第一个字段是否被跳过而没有留空。

为了便于查看设备的制造商,我们提供了系统已知的品牌/制造商列表,但是如果您的产品没有出现,可以选择手动编写。但是,我们需要验证手动输入字段是否为空,仅当它们已跳过第一个列表时才如此。

'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,'

我们尝试了上述操作,但没有成功,我们似乎无法在文档中找到任何有关检查字段是否为空的内容。

这两个字段只能一次提交。

2 个答案:

答案 0 :(得分:1)

在这种情况下,您无法将required_ifrequired_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,'