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
相关产品推荐
相关产品推荐

