laravel 如何验证数组索引和值

laravel how to validate array index and values

我正在提交一维值数组以在 laravel 5.6

上处理
quantity[4]:11
quantity[2]:14

我必须同时验证索引和值,索引应该作为股票存在,id 和值必须是整数且最小值 1

我试过了

public function rules()
{
    $rules = [
       'quantity.*' => 'exists:stocks,id',
       'quantity' => 'required|integer|min:1',
    ];

    return $rules;
}

但它只验证值而不是索引,请分享您的想法和评论。

我看不到任何可以使用默认 Laravel 验证来验证数组索引的地方。这就是为什么我们需要编写一个自定义的。

public function rules()
{
    $rules = [
       'quantity.*' => 'required|integer|min:1',
       'quantity' => [
           'required',
           'min:1', // make sure the input array is not empty <= edited
           'array',
           function($attribute, $value, $fail) {
               // index arr
               $ids = array_keys($value);
               // query to check if array keys is not valid
               $stockCntWithinArrIDs = StockModelFullNameWhaterver::whereIn('id', $ids)->count();
               if ($stockCntWithinArrIDs != count($ids))
                   return $fail($attribute.' is invalid.');  // -> "quantity is invalid"
           }
       ],
    ];

    return $rules;
}

要点是在查询 whereIn(以降低成本)他们的 id 与 quantity 的 array_keys 时比较股票盘点结果。因为quantity的索引存在于stocks,所以$stockCntWithinArrIDs必须等于count($ids),否则至少有一个索引不是stocks id.

您可以使用foreach ($ids),然后查询相应的stock,看看我的解决方案是否有效。但是请不要在生产环境中使用该解决方案。 :D

希望对您有所帮助!

已编辑:

参见:https://laravel.com/docs/5.6/validation#custom-validation-rules