【问题标题】:Laravel validate at least one item in a form arrayLaravel 验证表单数组中的至少一项
【发布时间】:2018-01-27 05:54:58
【问题描述】:

我有一个包含一系列数字的表格:

<input type="number" name="items[{{ $sku }}]" min="0" />
<input type="number" name="items[{{ $sku }}]" min="0" />
<input type="number" name="items[{{ $sku }}]" min="0" />

我想验证这些输入字段中至少有一个具有值。

我在 OrderCreateRequest 中尝试了以下操作,但测试通过了:

return [
    'items' => 'required|array|min:1'
];

我错过了什么吗?

【问题讨论】:

    标签: php laravel validation


    【解决方案1】:

    您可以为数组和 foreach 元素设置规则。

    public function rulez(Request $req) {
            $v = Validator::make($req->all(), [
                'items'   => 'required|array|min:1',
                'items.*' => 'required|integer|between:0,10'
    
            ]);
    
            if ($v->fails())
                return $v->errors()->all();
    }
    

    第一条规则说 items 必须是一个至少包含 1 个元素的数组。 第二条规则是项目的每个元素必须是 0 到 10 之间的整数。

    如果规则似乎不起作用,请尝试转储您的 $req->all()。

    dump($req->all());
    

    【讨论】:

    • 这意味着输入数组的所有元素都是必需的,并且它们可以最小为 1。他想要一个验证规则,使得数组的至少一个元素是必需的,其他元素是可选的。
    • ok,你可以使用'items' =&gt; 'required|array|min:1'你确定接收到Request参数正确吗?
    • 请添加一个简短的解释。
    • 我不是问这个问题的人。
    【解决方案2】:
    $this->validate($request,[
    'item'=>'required|min:1'
    
    ]);
    

    【讨论】:

      【解决方案3】:

      我认为您需要一个像下面这样的自定义验证规则,因为 min 不适用于数组的元素。

      Validator::extend('check_array', function ($attribute, $value, $parameters, $validator) {
           return count(array_filter($value, function($var) use ($parameters) { return ( $var && $var >= $parameters[0]); }));
      });
      

      您可以创建 ValidatorServiceProvider 并将这些行添加到 ValidatorServiceProvider 的引导方法中。然后你需要在 config/app.php 中将 Provider 添加到你的 providers 数组中。

      App\Providers\ValidatorServiceProvider::class,
      

      或者您只需将它们添加到控制器的操作顶部。

      最后,您可以在验证规则中像这样使用它。

      'items' => 'check_array:1',
      

      注意:如果我理解正确,它可以工作。

      【讨论】:

      • 很好的解决方案!谢谢。
      • 别忘了将'check_array' =&gt; 'at least one item is required',添加到langs/*/validation.php
      • 由于某种原因,现在总是返回 0 check sandbox.onlinephpfunctions.com/code/…
      • 您的代码有一些逻辑错误。所以你应该像这样尝试sandbox.onlinephpfunctions.com/code/…
      • 日期 01/08/2021 的字符串值无法通过验证器(php 7.4.8),因为参数是字符串并且斜线会破坏行为,我会改用 !empty($var)跨度>
      【解决方案4】:

      如果您在控制器文件中使用它,那么我猜它应该是

      $this->validate($request, [
          'items' => 'required|min:1'
      ]);
      

      或者这个

      $validator = Validator::make($request->all(), [
          "items.*" => 'required|min:1',
      ]);
      

      您也可以参考How to validate array in Laravel?

      【讨论】:

      • 第二个带有items.* 的示例将检查 items 数组中的所有值是否应至少包含 1 个字符,但在这里我们必须验证数组中至少应有 1 个元素,因此,首先示例是正确的,但第二个是错误的,因为它会检查值。
      • 第一个例子也是错误的,因为它会传递一个带有单个空值的数组。这个答案没有解决问题,不应该被赞成。
      【解决方案5】:
      'items'   => 'required|array', // validate that field must be from array type and at least has one value
      'items.*' => 'integer' // validate that every element in that array must be from integer type
      

      您可以为这些元素添加任何其他验证规则,例如:'items.*' =&gt; 'integer|min:0|max:100'

      【讨论】:

      • min 属性与计数项目无关,而是检查值本身
      • @behz4d 以及我检查元素的意思。 * 这里的意思是对这个数组中的每个元素应用规则。不检查计数
      【解决方案6】:

      除了 Hakan SONMEZ 的回答之外,要检查是否设置了至少一个数组元素,可以使用 Rule 对象。例如创建规则类并将其命名为 ArrayAtLeastOneRequired()。

      创建新规则类运行控制台命令:

      php artisan make:rule ArrayAtLeastOneRequired

      然后在创建的类中编辑方法pass():

      public function passes($attribute, $value)
          {
              foreach ($value as $arrayElement) {
                  if (null !== $arrayElement) {
                      return true;
                  }
              }
      
              return false;
          }

      使用此规则检查数组的至少一个元素是否不为空:

      Validator::make($request->all(), [
        'array' => [new ArrayAtLeastOneRequired()],
       ]);

      【讨论】:

      • 很好的答案!请注意,验证规则应应用于数组'array',而不是数组元素'array.*',否则foreach 循环将无法迭代。
      【解决方案7】:

      接受的答案是好的,它工作正常,但如果你不想创建函数和其他东西,那么我使用的另一个解决方法是

      您可以直接将数组的元素声明为items.0 并要求输入,它不会关心其他输入,但它会要求第一个输入,它并非在所有情况下都可用,但在我的情况下很有用。

      在你的OrderCreateRequest

      public function rules()
      {
         return [
             "items.0" => "required",
         ];
      }
      

      如果您的项目不是动态的并且数量不是很大,那么您可以使用required_without_all,如下所示:

      public function rules()
      {
         return [
             "items.0" => "required_without_all:items.1,items.2",
             "items.1" => "required_without_all:items.0,items.2",
             "items.2" => "required_without_all:items.0,items.1",
         ];
      }
      

      【讨论】:

        【解决方案8】:
        $valid = Validator($request->all(), [
            'type' => 'required|string|in:city,region,country',
        ]);
        
        if ($valid->fails()) return response()->json($valid->errors(), 400);
        

        【讨论】:

        • 口头解释通常很有帮助
        • 这个答案不正确,没有回答问题。
        【解决方案9】:

        “大小”规则用于匹配确切的编号。数组中的项目数(如果传入参数是一个数组),“min”规则也是如此,即它计算最小编号。数组中的元素个数(如果传入参数是数组)

        $this->validate($request, ['my_array' => 'size:6']); // array must have 6 items
        
        $this->validate($request, ['my_array' => 'min:1']); // there must be 1 item in array
        

        https://laravel.com/docs/8.x/validation#rule-size

        【讨论】:

          猜你喜欢
          • 2022-12-08
          • 2017-06-02
          • 2020-11-20
          • 1970-01-01
          • 2018-04-01
          • 2021-08-24
          • 1970-01-01
          • 2023-03-10
          • 1970-01-01
          相关资源
          最近更新 更多