You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 11:33:12