Laravel答题数据插入异常:仅插入一行且question_id错误
问题分析与修复方案
你遇到的两个问题根源其实很清晰:
- 仅插入一行数据:你只创建了一个
EnAnswer实例,循环过程中只是不断覆盖它的en_answer和question_id属性,最后仅执行一次save(),自然只会把最后一次循环的那条数据插入数据库。 - question_id不正确:循环条件
$i < count($data['en_answer'])会跳过最后一组数据——比如你有8道题,count()返回8,i从1到7就停止循环,直接漏掉了第8条数据。
修复后的控制器代码
public function store(Request $request, User $user){ $user_id = Sentinel::getUser()->id; $data = $request->all(); // 用Laravel推荐的request方法替代Input::get() // 遍历每一组回答与对应问题ID for($i = 1; $i <= count($data['en_answer']); $i++) { // 每次循环都新建一个EnAnswer实例,保证每条数据独立 $answer = new EnAnswer; $answer->user_id = $user_id; $answer->en_answer = $data['en_answer'][$i]; $answer->question_id = $data['question_id'][$i]; $answer->save(); // 每遍历一组就保存一次,插入一行数据 } return redirect('submitted')->with('status', 'Your answers successfully submitted'); }
额外优化建议
- 增加表单验证,避免用户漏答问题或者传入无效的question_id:
$request->validate([ 'question_id.*' => 'required|exists:equestions,id', // 验证question_id在数据库中存在 'en_answer.*' => 'required', // 确保每道题都有回答 ]); - 如果数据量较大,用批量插入可以提升性能(只执行一次SQL语句):
$answers = []; $user_id = Sentinel::getUser()->id; $data = $request->all(); for($i = 1; $i <= count($data['en_answer']); $i++) { $answers[] = [ 'user_id' => $user_id, 'question_id' => $data['question_id'][$i], 'en_answer' => $data['en_answer'][$i], 'created_at' => now(), 'updated_at' => now(), ]; } EnAnswer::insert($answers);
内容的提问来源于stack exchange,提问作者Rashed Hasan
相关产品推荐
相关产品推荐

