【问题标题】:Validation check field not empty验证检查字段不为空
【发布时间】:2019-07-23 11:22:50
【问题描述】:

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

对于检查设备品牌的上下文,我们提供了系统已知的品牌/品牌列表,但如果您的品牌没有出现,则可以选择手动编写。但是我们需要验证手动输入字段是否为空,但前提是他们跳过了第一个列表。

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

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

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

【问题讨论】:

  • 你试过使用'nullable'吗?
  • 我们不希望它们可以为空。我们需要将它们验证为已填充,而不是空/空。该字段被插入到不能将 Null 作为值的数据库列中。
  • 尝试使用“required_without”而不是“required_if”。检查此线程以获取更多信息:stackoverflow.com/questions/27875366/…
  • 文档说required_if:anotherfield,value,... The field under validation must be present and not empty if the anotherfield field is equal to any value. 所以,这里不适合。您的验证表明两者都需要存在。
  • 将每个语句中的第二个 if 交换为 without 并且无论如何它仍然试图验证另一个。 ('single_item_make_other' => 'required_if:policy_type,single|required_without:single_item_make')

标签: laravel laravel-5.3


【解决方案1】:

在这种情况下,您不能将required_ifrequired_without 组合,因为它会发生冲突。

在您当前的代码中,两者的第一条规则是:

required_if:policy_type,single

如果 policy_type === 'single' 需要这两个字段,如果其中 1 个字段为空,则此验证将失败。

一种解决方案可能是使用复杂的条件验证,如下所示:

$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 (xor),则必须扩展验证器,因为 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 不能有值。

您可以在验证中添加自定义错误消息或使用自定义验证器并在那里传递这些验证消息。

更多信息:https://laravel.com/docs/5.7/validation#conditionally-adding-rules

我没有测试过这两段代码,但它们应该可以工作。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 我们试过这个(在问题的 cmets 中注明)但失败了。它仍会尝试验证其他字段。
    • @MikeRampling 你能展示你的刀片吗?那我可以更好地理解你的上下文。
    猜你喜欢
    • 1970-01-01
    • 2018-06-01
    • 1970-01-01
    • 2020-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多