Laravel 8 如何实现多条件触发的数组字段required_if验证?
问题原因
你原来的验证规则不生效主要有3个问题:
- 规则逻辑是或关系而非你需要的且关系:你写了两个独立的
required_if,只要满足其中一个条件就会触发必填,而你需要的是「题型是radio/checkbox + required=1」两个条件同时满足才触发必填 - 规则存在语法问题:
radio,后面多了多余逗号,required, 1里多了空格,会导致字段匹配失败 - checkbox的
answer_id是数组格式,你没有额外校验数组非空
解决方案
1. 修正验证规则
推荐用Rule::requiredIf闭包实现多条件联动校验,逻辑更清晰,首先引入Rule类:
use Illuminate\Validation\Rule;
然后修改验证代码:
$data = request()->validate([ 'responses' => 'required|array', 'responses.*.questiontype' => 'required|in:radio,checkbox,text,textarea', 'responses.*.required' => 'required|integer', 'responses.*.answer_id' => [ Rule::requiredIf(function ($attribute) { // 提取当前题目的索引 $index = explode('.', $attribute)[1]; $questionType = request("responses.$index.questiontype"); $isRequired = request("responses.$index.required"); // 两个条件同时满足才必填 return in_array($questionType, ['radio', 'checkbox']) && $isRequired == 1; }), // 适配不同题型的格式校验,Laravel9+支持 Rule::when(fn ($attr) => request(explode('.', $attr)[1].'.questiontype') == 'checkbox', ['array', 'min:1']), Rule::when(fn ($attr) => request(explode('.', $attr)[1].'.questiontype') == 'radio', ['integer']), ], // 校验选中的选项id都是合法整数 'responses.*.answer_id.*' => 'integer', ]);
2. 修正Blade中checkbox的旧值回显逻辑
你原来的checkbox旧值判断直接用==比较是错的,因为responses.*.answer_id是数组,需要用in_array判断:
<input type="checkbox" name="responses[{{ $key }}][answer_id][]" id="answer{{ $answer->id }}" {{ in_array($answer->id, old('responses.' . $key . '.answer_id', [])) ? 'checked' : ''}} class="mr-2" value="{{ $answer->id }}">
内容的提问来源于stack exchange,提问作者user16810305
相关产品推荐
相关产品推荐

