Laravel验证:数组字段长度≥2时需必填关联字段的实现方案
解决方案:用闭包动态判断条件
你原来的required_if写法不生效,是因为这个规则的默认用法是匹配字段的具体值,没法直接判断数组长度。要实现「当brandsId数组元素≥2时,强制productListArray.*.brandId必填」的逻辑,用Laravel的Rule::requiredIf()闭包就能搞定,不需要自定义规则。
修改后的验证代码如下:
use Illuminate\Validation\Rule; $validator = Validator::make($inputFields, [ 'brandsId' => 'required|array|min:1', 'brandsId.*' => 'required|uuid', 'productListArray' => 'required|array|min:1', 'productListArray.*.name' => 'required|string', 'productListArray.*.brandId' => [ Rule::requiredIf(fn () => count($inputFields['brandsId']) >= 2), 'uuid' ] ]);
逻辑说明:
Rule::requiredIf()接收一个闭包,闭包里判断brandsId的长度是否≥2- 如果条件成立,
brandId就会触发required验证;条件不成立时,这个字段可选(但如果传了值,依然要符合uuid规则) - 保持
uuid规则在数组里,不管必填与否,只要传了值就会校验格式
如果需要更严谨,也可以给闭包加个兜底,防止brandsId不存在的情况(不过前面已经加了required|array规则,所以实际上不会出现):
Rule::requiredIf(fn () => isset($inputFields['brandsId']) && count($inputFields['brandsId']) >= 2)
内容的提问来源于stack exchange,提问作者Fabrice Lefloch
相关产品推荐
相关产品推荐

