Laravel如何验证数组中符合指定键值条件的元素最小数量
Laravel 二维数组指定键值计数验证解决方案
方案1:闭包验证规则(适合单次使用场景)
直接在表单请求类或控制器的验证逻辑中编写闭包即可,无需提前修改请求数据:
// 表单请求类 rules 方法示例 public function rules() { return [ 'photos' => ['required', 'array', function ($attribute, $value, $fail) { // 统计type为type_1的元素数量 $type1Count = collect($value)->where('type', 'type_1')->count(); if ($type1Count < 3) { $fail('photos数组中type为type_1的元素至少需要3个'); } }], 'photos.*.name' => ['required', 'string'], 'photos.*.type' => ['required', 'string', 'in:type_1,type_2'] ]; }
该方案逻辑集中在验证规则内,无需额外处理请求参数,适合仅单处用到该校验逻辑的场景。
方案2:自定义验证规则(适合多场景复用)
如果多个接口都需要类似的数组指定条件计数校验,可以封装全局通用规则:
- 生成规则类
php artisan make:rule CountArrayItemsWhere
- 编写规则逻辑
<?php namespace App\Rules; use Closure; use Illuminate\Contracts\Validation\ValidationRule; class CountArrayItemsWhere implements ValidationRule { protected $targetKey; protected $targetValue; protected $minCount; public function __construct(string $targetKey, mixed $targetValue, int $minCount) { $this->targetKey = $targetKey; $this->targetValue = $targetValue; $this->minCount = $minCount; } public function validate(string $attribute, mixed $value, Closure $fail): void { $matchedCount = collect($value)->where($this->targetKey, $this->targetValue)->count(); if ($matchedCount < $this->minCount) { $fail(":attribute 中{$this->targetKey}等于{$this->targetValue}的元素至少需要{$this->minCount}个"); } } }
- 调用规则
public function rules() { return [ 'photos' => ['required', 'array', new \App\Rules\CountArrayItemsWhere('type', 'type_1', 3)], // 其余子字段验证规则不变 ]; }
两种方案都完全遵循Laravel原生验证流程,不需要提前过滤请求数据,错误提示更精准,可维护性远高于预处理请求数据的实现。
内容的提问来源于stack exchange,提问作者LordF
相关产品推荐
相关产品推荐

