laravel如何验证数组索引和值

时间:2018-06-05 07:14:48

标签: php laravel laravel-5 laravel-validation

我正在提交一个单维数组值来处理laravel 5.6

quantity[4]:11
quantity[2]:14

我必须验证索引和值,索引应该以库存的形式退出,id和value必须是整数且最小值为1

我试过

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

    return $rules;
}

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

2 个答案:

答案 0 :(得分:3)

我无法在任何地方看到我们可以使用默认的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(以降低成本)时使用quantity的array_keys来比较库存计数结果。由于quantity中的stocks索引存在,$stockCntWithinArrIDs必须等于count($ids),否则,至少有一个索引不是stocks标识。

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

希望这有帮助!

已编辑:

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

答案 1 :(得分:0)

选中此项以获取数组唯一值https://laravel.com/docs/5.6/validation#rule-distinct