Laravel中required_with规则对数组无效,多数组长度一致性验证问题
解决关联数组长度一致性验证的问题
你目前的核心问题是:当materiales数组存在时,cantidades和unidades必须与它长度完全一致,但现有验证规则没有检查数组整体的长度匹配,导致unidades少了元素却没触发错误。
为什么现有规则没生效?
你写的required_with:materiales.*规则,作用是针对已存在的数组元素:如果对应位置的materiales元素存在,那么当前位置的cantidades/unidades元素必须存在。但如果unidades数组本身长度比materiales短(比如例子里materiales有3个元素,unidades只有2个),超出unidades长度的materiales[2]对应的unidades[2]根本不存在,验证器不会主动检查这个“缺失的元素”,自然不会报错。
解决方案:添加数组长度匹配验证
要解决这个问题,我们需要在验证规则里明确要求cantidades和unidades的长度必须与materiales一致,这里提供两种实现方式:
方式1:直接使用size规则(快速实现)
从规则格式看你应该用的是Laravel框架,可以直接用size规则结合请求中materiales的长度:
$materialesCount = count(request()->input('materiales', [])); $rules = [ 'materiales' => 'required|array', 'materiales.*' => 'nullable|exists:articulos,id', 'cantidades' => "required|array|size:$materialesCount", 'cantidades.*' => 'required_with:materiales.*|numeric|min:0.0001', 'unidades' => "required|array|size:$materialesCount", 'unidades.*' => 'required_with:materiales.*|required|numeric' ];
这种方式简单直接,但要注意如果materiales是动态传入的,要确保在生成规则时能正确获取到它的长度。
方式2:自定义验证规则(更灵活可复用)
如果需要在多个地方复用这个“数组长度匹配”的验证逻辑,建议自定义一个规则:
use Illuminate\Contracts\Validation\Rule; class SameSizeAs implements Rule { protected $targetField; public function __construct(string $targetField) { $this->targetField = $targetField; } public function passes($attribute, $value) { $targetArray = request()->input($this->targetField); // 确保两个都是数组,且长度相等 return is_array($value) && is_array($targetArray) && count($value) === count($targetArray); } public function message() { return "The :attribute array must have the same number of elements as the {$this->targetField} array."; } }
然后在验证规则中使用这个自定义规则:
$rules = [ 'materiales' => 'required|array', 'materiales.*' => 'nullable|exists:articulos,id', 'cantidades' => ['required', 'array', new SameSizeAs('materiales')], 'cantidades.*' => 'required_with:materiales.*|numeric|min:0.0001', 'unidades' => ['required', 'array', new SameSizeAs('materiales')], 'unidades.*' => 'required_with:materiales.*|required|numeric' ];
这种方式不仅更灵活,还能返回更清晰的错误提示,方便调试和用户理解。
补充说明
添加长度验证后,再配合原有的required_with:materiales.*规则,就能同时保证:
- 三个数组的元素数量完全一致
- 每个位置的
cantidades和unidades元素,在对应materiales元素存在时必须必填且格式正确
内容的提问来源于stack exchange,提问作者ZJaume
相关产品推荐
相关产品推荐

