Laravel实现外层带booking_id的多维数组存储 关联健康问题与预订ID
问题修正方案
原代码存在的核心错误
- 循环层级错位:把整个请求体直接塞进
$data数组后,循环遍历的是请求的一级结构,根本没触达实际存健康问题的issues子数组 - 取值语法混用:循环里对数组元素同时用对象属性取法(
$d->booking_id)和数组键取法($d['issue']),会直接触发类型错误 - 数据库传参错误:
insert("courseData")给插入方法传了字符串"courseData",不是之前组装好的数组变量 - 字段读取路径错误:
issue、url是issues数组下每个子项的属性,不在请求一级层级里,直接读会取不到值
可直接运行的修正后代码
public function MobileBookingIssue(Request $request) { // 校验请求字段合法性,避免非法数据入库 $validated = $request->validate([ 'booking_id' => 'required|integer', 'issues' => 'required|array', 'issues.*.issue' => 'required|string', 'issues.*.url' => 'required|string' ]); $insertData = []; // 遍历健康问题列表,每条记录绑定外层的公共booking_id foreach ($validated['issues'] as $issueInfo) { $insertData[] = [ 'booking_id' => $validated['booking_id'], 'issue' => $issueInfo['issue'], 'url' => $issueInfo['url'], // 若表结构有时间戳非空约束,必须补充对应字段值 'created_at' => now(), 'updated_at' => now() ]; } // 批量插入组装完成的数据 DB::table("booking_health_issues")->insert($insertData); return response()->json(["message" => "success"]); }
核心逻辑说明
- 先通过Laravel内置验证器校验请求结构,提前拦截格式错误的请求,避免触发数据库异常
- 从请求一级层级单独取出公共的
booking_id,和遍历issues时获取的单条问题、图片路径做组装,保证每一条入库记录都能正确关联对应预订ID - 插入操作时直接传递组装好的数组变量,不要把变量名当成字符串传入方法
- 如果数据库表配置了自动维护时间戳,要在组装数组时补充
created_at、updated_at字段值,否则会因为缺少非空字段导致插入失败
内容的提问来源于stack exchange,提问作者dac dac
相关产品推荐
相关产品推荐

