laravel 下单时,把库存充足条件写进同一条扣减语句,再根据受影响行数决定是否创建订单。扣减与创建订单放在同一个数据库事务里,写入失败时可以一起回滚。
确认下单接口和数据表的前置条件
示例使用 Laravel 12 与 MySQL InnoDB。假定 products 含 id、stock,orders 含 user_id、product_id、quantity、created_at、updated_at。把控制器方法挂到已有的认证路由。
use App\Http\Controllers\OrderController;
use Illuminate\Support\Facades\Route;
Route::post('/orders', [OrderController::class, 'store'])
->middleware('auth');

库存字段采用整数。若项目还要限制商品可售状态、租户或仓库,将这些条件一并放到更新语句中。
先校验数量,再在同一事务里扣库存和写订单
下例放在现有 OrderController 中。没有符合条件的商品行时抛出验证异常,由事务回滚。
public function store(\Illuminate\Http\Request $request)
{
$input = $request->validate([
'product_id' => ['required', 'integer', 'min:1'],
'quantity' => ['required', 'integer', 'min:1', 'max:100'],
]);
$quantity = (int) $input['quantity'];
$userId = $request->user()->id;
$orderId = \Illuminate\Support\Facades\DB::transaction(
function () use ($input, $quantity, $userId) {
$changed = \Illuminate\Support\Facades\DB::table('products')
->where('id', $input['product_id'])
->where('stock', '>=', $quantity)
->decrement('stock', $quantity);
if ($changed !== 1) {
throw \Illuminate\Validation\ValidationException::withMessages([
'quantity' => '商品不存在或库存不足',
]);
}
return \Illuminate\Support\Facades\DB::table('orders')->insertGetId([
'user_id' => $userId,
'product_id' => $input['product_id'],
'quantity' => $quantity,
'created_at' => now(),
'updated_at' => now(),
]);
}
);
return response()->json(['order_id' => $orderId], 201);
}

Laravel Cloud(cloud.laravel.com)。此技能用于处理所有 Laravel Cloud 请求,包括搜索和读取数据。只要任务涉及 Laravel Cloud,即使用此技能。
扣减数量必须为正整数。订单写入抛出异常时,事务会回滚此前的扣减。
用库存 3、两次各买 2 来核对
在测试库把同一商品库存设成 3,再用已登录测试账号向接口提交两次相同的请求。使用 JSON 请求时,库存不足应表现为 422。
{"product_id": 1, "quantity": 2}
预期只有一次成功,库存剩 1,新增一条订单。重复请求识别是另一个约束,需要按业务设计幂等键。










