You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel答题数据插入异常:仅插入一行且question_id错误

问题分析与修复方案

你遇到的两个问题根源其实很清晰:

  1. 仅插入一行数据:你只创建了一个EnAnswer实例,循环过程中只是不断覆盖它的en_answer和question_id属性,最后仅执行一次save(),自然只会把最后一次循环的那条数据插入数据库。
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 07:20:18