我正在开发一次考勤系统,在记录考勤时,我必须做批量插入。我正在使用以下代码,它工作得很好。
foreach ($request->selectedEmployees as $employee) {
foreach ($employee['attendances'] as $att) {
$att['created_by'] = Auth::id();
$attendaces [] = new Attendance($att);
}
Employee::findOrFail($employee['id'])->attendances()
->saveMany($attendaces);
}
输入结构,
[
"selectedEmployees": [
{
"id": 119,
"attendances": [
{
"id": "119_01",
"employees_id": 119,
"type": 1,
"date": "01-07-2015",
"signin": "9.00",
"signout": "6.00",
"lunch_in_time": "1.30",
"lunch_out_time": "2.00",
"add_in_time": "",
"add_out_time": "",
"note": ""
}
]
}
]
我想优化我的代码,
- 避免插入循环,并做批量插入
- 将插入进程作为后端线程运行,并在完成后通知用户(我使用angularJS前端)
这些优化在laravel5.1
中是可能的吗?是否有其他的优化技术?
- 你必须明白,即使你使用
saveMany()
方法,Laravel单独保存每一行。所以你的算法的复杂度将是O(n)即使你试图优化它。而且还不错。 - 你可以使用异步ajax请求。它不会阻止用户的页面,完成后你会向用户显示一个通知。或者您可以使用广播事件机制。它更复杂,但会使你的代码更优雅,可以这么说。