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

Laravel 8如何将多选房间值插入数据库多条记录?

客房预订系统:多房间订单的明细插入实现

我正在开发一个客房预订系统,客户创建订单时可以选择多个房间。目前有两张数据表:

  • Order表:包含order_id、customer_name等字段
  • OrderDetail表:包含id、order_id、room_number字段

需要实现的功能:创建订单后,把所有选中的房间作为单独记录插入OrderDetail表,每条记录都关联刚生成的订单order_id。

以下是现有代码:

模型文件

Order.php

class Order extends Model
{
    protected $table = "Order";
    protected $primaryKey = 'order_id';
    public function Details() {
        return $this->hasMany(OrderDetail::class, 'order_id');
    }
}

OrderDetail.php

class OrderDetail extends Model
{
    protected $table = "OrderDetail";
    public function FromOrder() {
        return $this->belongsTo(Order::class, 'order_id', 'order_id');
    }
}

控制器原有代码

OrderController.php

public function store(Request $request)
{
 $Order = new Order();
 $Order->customer_name = $request->input('customer_name');
 // 其他字段赋值
 $Order->save();
}

前端多选输入框

<select class="custom-select form-control-border" id="roomnumber" name="roomnumber[]" multiple>
    @foreach($Room as $key => $item)
    <option class="item-{{$item->id}}" value="{{$item->room_number}}">{{$item->room_number}}</option>
    @endforeach
</select>

实现方案

只需要在控制器的store方法里,订单保存后处理选中的房间数组,批量插入明细即可,推荐两种方式:

方式一:利用Eloquent关联批量创建

通过Order模型的Details关联直接生成明细,代码更简洁,还能自动关联order_id:

public function store(Request $request)
{
    $Order = new Order();
    $Order->customer_name = $request->input('customer_name');
    // 其他字段赋值
    $Order->save();

    // 获取提交的房间号数组,默认空数组防止报错
    $roomNumbers = $request->input('roomnumber', []);
    
    // 构造明细数据
    $details = [];
    foreach ($roomNumbers as $num) {
        $details[] = ['room_number' => $num];
        // 有其他字段的话直接在这里添加
    }

    // 批量插入明细
    if (!empty($details)) {
        $Order->Details()->createMany($details);
    }
}

方式二:直接批量插入(效率更高)

如果不需要依赖关联,直接用OrderDetail模型的insert方法批量插入,手动指定order_id:

public function store(Request $request)
{
    $Order = new Order();
    $Order->customer_name = $request->input('customer_name');
    // 其他字段赋值
    $Order->save();

    $roomNumbers = $request->input('roomnumber', []);
    $details = [];
    foreach ($roomNumbers as $num) {
        $details[] = [
            'order_id' => $Order->order_id,
            'room_number' => $num
        ];
    }

    if (!empty($details)) {
        OrderDetail::insert($details);
    }
}

额外提示

  • 可以加个请求验证,确保用户至少选一个房间:
$this->validate($request, [
    'customer_name' => 'required',
    'roomnumber' => 'required|array|min:1'
]);
  • 只要Order表的order_id是自增主键,订单保存后就能通过$Order->order_id拿到新生成的ID。

内容的提问来源于stack exchange,提问作者Chidoka

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 12:35:29