Laravel 9中如何通过事务正确保存一对一关联模型数据
Laravel 9 一对一关联事务写入修复方案
你的代码存在几个可直接修正的问题,按Laravel框架的关联逻辑规范调整后,就能正确获取新创建酒店的自增ID完成外键绑定:
- 硬编码了
hotel_id为固定值39,没有使用新生成的酒店ID - 设施数据中重复定义
bar字段,后一个赋值会覆盖前一个,属于笔误 - 额外执行
Hotel::find($hotel->id)是完全冗余的查询,Hotel::create()执行成功后,返回的$hotel实例已经自带新生成的自增ID - 调用关联的写入方法时,Laravel会自动完成外键赋值,不需要手动给关联模型设置外键
修正后的可运行代码
DB::transaction(function () use ($request) { // 写入酒店基础信息,成功后$hotel实例直接包含自增主键id $hotel = Hotel::create([ 'name' => $request->input('name'), 'address' => $request->input('address'), 'postcode' => $request->input('postcode'), 'state' => $request->input('state'), 'star_rating' => $request->input('star_rating'), ]); // 通过关联方法直接写入设施信息,框架自动绑定hotel_id外键 $hotel->facility()->create([ 'fitness_centre' => true, 'bar' => true, // 移除重复的bar字段定义,按实际业务需求赋值即可 'parking' => true, 'free_wifi' => true, ]); });
排错提示:如果执行时拿不到
$hotel->id,先检查Hotel和HotelFacility模型的$fillable属性,是否已经把对应字段加入了批量赋值白名单。create方法走批量赋值逻辑,未加入白名单的字段不会被写入,会导致模型创建失败。
逻辑说明
Eloquent的create方法在数据入库成功后,会直接把数据库生成的自增主键值绑定到返回的模型实例上,只要方法没有抛出异常,不需要额外查询数据库就能直接读取$hotel->id。
调用一对一关联的create/save方法时,框架会自动提取主模型的主键值,填充到关联模型的外键字段(即你配置的hotel_id),不需要手动给外键赋值。
内容的提问来源于stack exchange,提问作者ottz0
相关产品推荐
相关产品推荐

