laravel 点餐订单应把商品名称和下单时的单价存进订单明细。历史订单从明细读取价格,菜单调价后,旧订单仍能显示成交时的金额。
给订单明细保留独立字段
下面用已有的 orders 和 order_items 表演示一条菜品明细。金额用整数分,菜品在 menu_items 表维护。
Schema::table('order_items', function (Blueprint $table): void {
$table->string('item_name');
$table->unsignedInteger('unit_price_cents');
});
这是新项目或尚无明细的迁移片段,Schema 和 Blueprint 从 Laravel 数据库命名空间导入。已有历史订单时应先决定怎样回填旧成交价。
在事务里从菜单读取价格并写入
在已有认证控制器中先校验菜品 ID 和数量。示例假定两表有时间戳,订单有 user_id,明细有 order_id、menu_item_id 和 quantity。
Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
$data = $request->validate([
'menu_item_id' => ['required', 'integer', 'min:1'],
'quantity' => ['required', 'integer', 'min:1', 'max:20'],
]);
$userId = $request->user()->id;
$orderId = \Illuminate\Support\Facades\DB::transaction(function () use ($data, $userId) {
$item = \Illuminate\Support\Facades\DB::table('menu_items')
->where('id', $data['menu_item_id'])->where('is_active', 1)
->lockForUpdate()->first();
abort_if($item === null, 422, '菜品不可下单');
$orderId = \Illuminate\Support\Facades\DB::table('orders')->insertGetId([
'user_id' => $userId, 'created_at' => now(), 'updated_at' => now(),
]);
\Illuminate\Support\Facades\DB::table('order_items')->insert([
'order_id' => $orderId, 'menu_item_id' => $item->id,
'item_name' => $item->name, 'unit_price_cents' => $item->price_cents,
'quantity' => $data['quantity'], 'created_at' => now(), 'updated_at' => now(),
]);
return $orderId;
});
客户端只提交菜品和数量。写入明细失败时,订单写入也会回滚。
调价后对照历史订单明细
在测试环境先按 1200 分下单两份,再把菜单价格改为 1500 分。通过已授权订单页面读取明细。
SELECT item_name, unit_price_cents, quantity,
unit_price_cents * quantity AS line_total_cents
FROM order_items
WHERE order_id = 1;将 1 换成测试订单 ID。旧订单仍应显示单价 1200 分、合计 2400 分。

















