Laravel开发求助:如何将两个数组数据组合后批量写入数据库表
Laravel数组数据批量写入数据库问题解决
我来帮你排查代码里的问题,同时给出更优的解决方案:
你的代码存在的问题
- 提前终止循环:在
foreach循环内部,你执行$test_log->save()后立刻return响应,这会导致循环只处理第一个result值就停止,永远不会插入第二条数据。 - 错误的取值方式:
$result是你循环遍历的单个数值(比如7、8),但你用了$result['id']来取值,这会抛出Undefined index: id的错误,直接使用$result即可。 - 性能低效:循环中每次实例化模型并调用
save(),对于批量数据来说不如批量插入高效。
修复后的循环写法(基础版)
如果想保留循环的方式,修改如下:
$result = $request->result; $studentTestId = $request->student_test_id; $questionId = $request->question_id; $testId = $request->test_id; // 先初始化一个状态变量 $isSuccess = true; foreach($result as $res){ $test_log = new StudentTestLog(); $test_log->student_test_id = $studentTestId; $test_log->question_id = $questionId; $test_log->test_id = $testId; $test_log->result = $res; // 直接使用单个数值res if(!$test_log->save()){ $isSuccess = false; // 这里不直接return,继续处理剩余数据或者可以选择中断 break; } } // 循环结束后统一返回响应 if($isSuccess){ return response()->json('Submitted', 200); }else{ return response()->json('Error Submitting', 400); }
更高效的批量插入方案(推荐)
Laravel支持批量插入,只需要构造好数据数组,一次性插入,性能更好:
$result = $request->result; $baseData = [ 'student_test_id' => $request->student_test_id, 'question_id' => $request->question_id, 'test_id' => $request->test_id, ]; // 构造批量插入的数据数组 $insertData = []; foreach($result as $res){ $insertData[] = array_merge($baseData, ['result' => $res]); } // 批量插入 $isSuccess = StudentTestLog::insert($insertData); if($isSuccess){ return response()->json('Submitted', 200); }else{ return response()->json('Error Submitting', 400); }
这样就能实现你预期的效果,把两个数组组合后批量写入数据库表啦。
内容的提问来源于stack exchange,提问作者Ikenna Anikwe
相关产品推荐
相关产品推荐

