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

Posted

技术标签:

【中文标题】Laravel 验证表单数组中的至少一项【英文标题】:Laravel validate at least one item in a form array 【发布时间】: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'
];

我错过了什么吗?

【问题讨论】:

【参考方案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

【讨论】:

以上是关于Laravel 验证表单数组中的至少一项的主要内容,如果未能解决你的问题,请参考以下文章

验证laravel 4错误中的数组表单字段

在 laravel 表单请求验证中验证数组对象?

方法验证不存在 - Laravel 5.4

Laravel验证数组中至少需要一个元素

Laravel“至少一个”字段需要验证

验证数组中的 Laravel 嵌套规则