【问题标题】:Laravel 5.2 validator: Validate Array request parameter, at least one value must be selectedLaravel 5.2 验证器:验证数组请求参数,必须至少选择一个值
【发布时间】:2016-03-28 10:39:49
【问题描述】:

我的表单中有标题、正文、答案[][answer] 和选项[][option]。

我希望必须为给定问题选择至少一个答案,例如:

我有ABC 的问题,并且该问题有 5 个选项,现在必须检查给定问题的至少一个答案或全部答案。

努力

protected $rules = [
            'title' => 'required|unique:contents|max:255',
            'body' => 'required|min:10',
            'type' => 'required',
            'belongsto' => 'sometimes|required',
            'options.*.option' => 'required|max:100',
            'answers.*.answer' => 'required',
        ];

但这不起作用。我希望必须至少选择一个答案。

请帮帮我。

【问题讨论】:

    标签: php validation laravel-5.2


    【解决方案1】:

    问题是在 $_POST 上,如果没有选择答案,则将传递一个填充了空字符串的数组。

    $answers[0][0] = ''
    $answers[0][1] = ''
    $answers[0][2] = ''
    

    因此,由于空字符串,数组计数将大于零,因此以下操作将不起作用:

     $validator = Validator::make($request->all(), [
        'answers.*'   => 'required'
      ]);
    

    解决此问题的最简单方法是使用 Laravel 的 Validator::extend 函数创建自定义验证器规则。

      Validator::extendImplicit('arrayRequireMin', function($attribute, $values, $parameters)
      {
          $countFilled = count(array_filter($values));
          return ($countFilled >= $parameters[0]);
      });
    

    然后在您的验证请求中调用它:

      $validator = Validator::make($request->all(), [
        'answers.*'   => 'arrayRequireMin:1'
      ]);
    

    魔法发生在 array_filter() 中,它从数组中删除所有空属性。现在您可以设置所需的任何最小答案数。

    Validator::extendImplicit() vs Validator::extend()

    要使规则在属性为空时也能运行,该规则必须暗示该属性是必需的。要创建这样一个“隐式”扩展,请使用 Validator::extendImplicit() 方法:

    Laravel's validation docs

    【讨论】:

      【解决方案2】:

      试试这个,

          'answer.0' => 'required'       
      

      它会帮助你。我想。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-11-20
        • 2021-12-24
        • 1970-01-01
        • 1970-01-01
        • 2022-12-08
        • 1970-01-01
        • 2011-03-13
        相关资源
        最近更新 更多