Laravel验证表单数组中的至少一个项目

时间:2017-08-18 13:55:41

标签: php laravel validation

我有一个数组中包含一系列数字的表单:

<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'
];

我错过了什么吗?

9 个答案:

答案 0 :(得分:5)

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

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

或者这个

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

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

答案 1 :(得分:4)

我认为您需要一个自定义验证规则,如下所示,因为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',

注意:如果我理解正确,那就可以了。

答案 2 :(得分:4)

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

要创建新的规则类,请运行控制台命令:

No fill from ad server.
Failed to load ad: 3

然后在创建的类中使用edit方法pass():

php artisan make:rule ArrayAtLeastOneRequired

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

public function passes($attribute, $value)
    {
        foreach ($value as $arrayElement) {
            if (isset($arrayElement)) {
                return true;
            }
        }

        return false;
    }

答案 3 :(得分:0)

您可以为数组和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();
}

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

如果规则似乎不起作用,请尝试转储$ req-&gt; all()。

dump($req->all());

答案 4 :(得分:0)

可接受的答案是可以的,并且工作正常,但是如果您不想创建函数和其他内容,那么我使用的另一种解决方法是

您可以将数组的元素直接声明为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",
   ];
}

答案 5 :(得分:0)

$valid = Validator($request->all(), [
    'type' => 'required|string|in:city,region,country',
]);

if ($valid->fails()) return response()->json($valid->errors(), 400);

答案 6 :(得分:0)

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

$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

答案 7 :(得分:-1)

$this->validate($request,[
'item'=>'required|min:1'

]);

答案 8 :(得分:-1)

'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.*' => 'integer|min:0|max:100'