【问题标题】:Required field only if another field has a value, must be empty otherwise仅当另一个字段有值时为必填字段,否则必须为空
【发布时间】:2018-07-03 09:27:50
【问题描述】:

我的问题是关于 Laravel validation rules

我有两个输入 aba 是具有三个可能值的选择输入:xyz。我要写这条规则:

b 必须有一个值仅当 a x。 并且b 必须否则为空。

有没有办法写出这样的规则?我试过required_withrequired_without,但它似乎无法涵盖我的情况。

也就是说,如果前面的解释不够清楚:

  • 如果a == xb 必须有一个值。
  • 如果a != xb 必须为空。

【问题讨论】:

    标签: php laravel laravel-5 laravel-5.5 laravel-validation


    【解决方案1】:

    您必须创建自己的验证规则。

    编辑app/Providers/AppServiceProvider.php 并将此验证规则添加到boot 方法中:

    // Extends the validator
    \Validator::extendImplicit(
        'empty_if',
        function ($attribute, $value, $parameters, $validator) {
            $data = request()->input($parameters[0]);
            $parameters_values = array_slice($parameters, 1);
            foreach ($parameters_values as $parameter_value) {
                if ($data == $parameter_value && !empty($value)) {
                    return false;
                }
            }
            return true;
        });
    
    // (optional) Display error replacement
    \Validator::replacer(
        'empty_if',
        function ($message, $attribute, $rule, $parameters) {
            return str_replace(
                [':other', ':value'], 
                [$parameters[0], request()->input($parameters[0])], 
                $message
            );
        });
    

    (可选)resources/lang/en/validation.php 中的错误创建一条消息:

    'empty_if' => 'The :attribute field must be empty when :other is :value.',
    

    然后在控制器中使用此规则(使用require_if 以尊重原始帖子的两个规则):

    $attributes = request()->validate([
        'a' => 'required',
        'b' => 'required_if:a,x|empty_if:a,y,z'
    ]);
    

    有效!

    旁注:我可能会使用 empty_ifempty_unless 创建一个包来满足此需求,并在此处发布链接

    【讨论】:

      【解决方案2】:

      Required if

      required_if:anotherfield,value,... 如果 anotherfield 字段等于任何值,则验证中的字段必须存在且不为空。

      'b' => 'required_if:a,x'
      

      【讨论】:

      • 谢谢,但除非我弄错了,否则它只涵盖第一条规则:“如果 a == x,b 必须有一个值。”。但它没有涵盖第二条规则:“如果 a != x,b 必须为空。”
      • @rap-2-h 您需要为此创建自定义规则。
      • @AlexeyMezenin 好的,如果您愿意,可以将其发布为答案。否则,我将发布我自己的。所以如你所愿! :)
      • @rap-2-h 请张贴。 )
      【解决方案3】:

      我知道现在回答这个问题为时已晚,但对于那些后来才知道的人来说,Laravel 有自己的方法可以在另一个字段存在时要求一个字段。该方法名为“required_with”,您可以在here找到更多相关信息。

      【讨论】:

      • 问题的作者提到,“我试过 required_with, required_without 但它似乎无法涵盖我的情况。”那你为什么要建议同样的事情
      猜你喜欢
      • 1970-01-01
      • 2019-07-23
      • 2018-04-30
      • 1970-01-01
      • 1970-01-01
      • 2017-03-29
      • 1970-01-01
      • 1970-01-01
      • 2019-05-15
      相关资源
      最近更新 更多