Laravel使用多层foreach处理表格表单提交数据并插入数据库的实现方法
Laravel 控制器保存考勤表格数据实现方案

你现有的数组转换逻辑已经可以把嵌套的表单输入转换为符合入库要求的扁平结构,只要补充验证、入库逻辑即可,完整实现如下:
1. 前置要求
先确认你的考勤表对应模型(示例中模型名为Attendance),表结构至少包含以下字段:
employee_name字符串类型,存储员工姓名presence_value数值类型,存储考勤值(1/0.5/0)attendance_date字符串或日期类型,存储考勤日期
如果字段名不同,后续代码中数组的键名对应修改即可。
2. 完整控制器代码
public function submit(Request $request) { // 数据合法性验证 $request->validate([ 'row' => 'required|array', 'row.*.employee_name' => 'required|string', 'row.*.presence' => 'required|array', 'row.*.presence.*.presenceType' => 'required|in:1,0.5,0', 'row.*.presence.*.presencedate' => 'required|string', ]); // 转换为可入库的一维数组 $insertData = collect($request->row) ->flatMap(function ($row) { return collect($row['presence'])->map(fn($presence) => [ 'employee_name' => $row['employee_name'], 'presence_value' => $presence['presenceType'], 'attendance_date' => $presence['presencedate'], 'created_at' => now(), 'updated_at' => now(), ]); }) ->toArray(); // 批量插入数据库,性能远高于循环单条插入 \App\Models\Attendance::insert($insertData); // 提交成功后返回原页面带成功提示 return back()->with('success', '考勤数据已成功保存'); }
3. 可选优化
- 如果需要覆盖更新已有的同员工同日期考勤数据,可将批量插入逻辑改为逐条调用
updateOrCreate:foreach ($insertData as $item) { \App\Models\Attendance::updateOrCreate( ['employee_name' => $item['employee_name'], 'attendance_date' => $item['attendance_date']], $item ); } - 如果数据库的日期字段为标准
date类型,可将attendance_date的赋值改为Carbon\Carbon::parse($presence['presencedate'])->toDateString(),自动转换为Y-m-d格式存储。
内容的提问来源于stack exchange,提问作者Michel Setyawan Mulyono
相关产品推荐
相关产品推荐

