Laravel测验系统保存时出现Undefined array key 'answers'错误如何解决
问题根源
- 初始方案重复存储答案:循环所有问题时,都将全局的
$data['answers']全部插入到当前问题下,导致每个问题都关联了所有答案 - 调整表单后报错:将字段结构改为
questions[x][answers][]后,答案数据已经归属到每个questions数组的子元素下,你的验证规则和存储逻辑仍然在读取顶层的answers数组,自然会提示数组键不存在。
前端修改
修正old取值和错误提示路径,适配新的字段结构:
- 问题2的question字段old值改为
{{ old('questions.2.question') }},对应的@error字段也改为questions.2.question - 所有答案字段的old值改为对应层级,例如问题1的第一个答案old为
{{ old('questions.1.answers.0') }},对应的@error字段也改为questions.1.answers.0,以此类推调整所有答案的old和error路径。
后端修改
1. 调整验证规则
将原有的answers相关验证改为适配新结构的规则:
$data = request()->validate([ 'title.title' => 'required', 'questions.*.question' => 'required', 'questions.*.answers.*' => 'required', // 校验每个问题下的所有答案 ], [ 'title.title.required' => 'გთხოვთ, შეიყვანოთ ქვიზის სახელი.', 'questions.*.question.required' => 'გთხოვთ, შეიყვანოთ შეკითხვა.', 'questions.*.answers.*.required' => 'გთხოვთ, შეიყვანოთ პასუხი.' ]);
2. 调整存储逻辑
循环每个问题时,仅读取当前问题关联的答案,格式化后插入:
$storeQuiz = $quizzes->create($data['title']); foreach ($data['questions'] as $q) { $question = $storeQuiz->questions()->create(['question' => $q['question']]); // 把当前问题的答案数组转为createMany要求的键值格式 $answers = collect($q['answers'])->map(function ($answer) { return ['answer' => $answer]; })->toArray(); $question->answers()->createMany($answers); } return redirect('admin/quizzes');
内容的提问来源于stack exchange,提问作者Voleb
相关产品推荐
相关产品推荐

