Laravel中如何校验数据库记录是否存在,存在则增量更新数量否则新增
购物车项新增/数量自动递增功能实现方案
前端Angular端实现
- 首先统一请求参数结构,需携带的必填字段为
product_id(商品唯一标识)、qty(本次新增的商品数量),如果商品有多规格属性需额外携带sku_id - 发送POST请求示例代码:
// cart.service.ts addCartItem(cartItem: {productId: number, qty: number, skuId?: number}) { return this.http.post('/api/cart/add', cartItem); }
- 注意不要在前端硬编码用户ID,用户身份校验由后端通过登录态完成,避免用户篡改请求操作他人购物车
后端Laravel端实现
Laravel提供了原生方法可以快速实现「存在则更新、不存在则新增」的逻辑,无需手动写exists判断。
1. 定义路由(routes/api.php)
Route::post('/cart/add', [CartController::class, 'addItem'])->middleware('auth:sanctum');
建议加auth中间件,从登录态取当前用户ID,避免非法操作
2. 控制器核心逻辑(app/Http/Controllers/CartController.php)
<?php namespace App\Http\Controllers; use Illuminate\Http\Request; use App\Models\CartItem; class CartController extends Controller { public function addItem(Request $request) { // 校验请求参数 $validated = $request->validate([ 'product_id' => 'required|exists:products,id', 'qty' => 'required|integer|min:1', 'sku_id' => 'nullable|exists:skus,id' ]); // 以用户ID+商品ID+SKU ID为重复记录唯一判断条件 $uniqueCondition = [ 'user_id' => auth()->id(), 'product_id' => $validated['product_id'], 'sku_id' => $validated['sku_id'] ?? null ]; // 存在则累加数量,不存在则初始化新增 $cartItem = CartItem::firstOrNew($uniqueCondition, ['qty' => 0]); $cartItem->qty += $validated['qty']; $cartItem->save(); // 返回处理后的购物车数据供前端更新视图 return response()->json([ 'code' => 200, 'data' => $cartItem, 'msg' => '添加成功' ]); } }
高并发场景优化
如果遇到高并发添加购物车的场景,为了避免数量计算错误,可以改用原子操作实现:
// 先尝试更新已存在的记录 $updated = CartItem::where($uniqueCondition)->increment('qty', $validated['qty']); // 没更新到说明记录不存在,执行新增 if (!$updated) { $cartItem = CartItem::create(array_merge($uniqueCondition, ['qty' => $validated['qty']])); }
内容的提问来源于stack exchange,提问作者Bonny
相关产品推荐
相关产品推荐

