贝利信息

如何修复 Laravel 购物车添加逻辑中的 Auth::id() 调用错误

日期:2026-01-25 00:00 / 作者:碧海醫心

该教程详解 laravel 中因误用 `auth::id()->exists()` 导致的类型错误,并提供正确写法、完整修复代码及关键注意事项。

在 Laravel 开发中,向购物车添加商品时常见的一个逻辑是:先判断当前登录用户是否已将该商品加入购物车。但很多开发者(尤其是初学者)容易混淆 Query Builder 方法的调用顺序,导致类似以下错误:

Expected type 'object'. 

Found 'int|string|null'.

问题根源就出在这行代码:

if (Cart::where('prod_id', $product_id)->where('user_id', Auth::id()->exists())) {

这里存在两个关键错误:

  1. 语法错误:Auth::id() 返回的是 int(用户 ID)或 null(未登录),它不是 Eloquent 查询构造器对象,因此不能在其后链式调用 ->exists();
  2. 逻辑错误:->exists() 是 Query Builder 的方法,必须作用于查询实例(如 Cart::where(...)->where(...)),而非 Auth::id()。

✅ 正确写法应为:

if (Cart::where('prod_id', $product_id)
      ->where('user_id', Auth::id())
      ->exists()) {
    // 商品已存在购物车中
}

->exists() 会执行 SQL 查询并返回布尔值(true/false),语义清晰且高效(不加载模型实例)。

以下是修复后的完整 addProduct 方法(含健壮性增强):

public function addProduct(Request $request)
{
    $product_id = $request->input('product_id');
    $product_qty = $request->integer('product_qty', 1); // 安全默认值 + 类型校验

    if (!Auth::check()) {
        return response()->json(['status' => 'Login to Continue'], 401);
    }

    $prod_check = Product::find($product_id);
    if (!$prod_check) {
        return response()->json(['status' => 'Product not found'], 404);
    }

    // ✅ 正确:先构建查询,再调用 exists()
    if (Cart::where('prod_id', $product_id)
              ->where('user_id', Auth::id())
              ->exists()) {
        return response()->json(['status' => $prod_check->name . ' Already Added to Cart']);
    }

    // 创建新购物车项
    Cart::create([
        'prod_id' => $product_id,
        'user_id' => Auth::id(),
        'prod_qty' => $product_qty,
    ]);

    return response()->json(['status' => $prod_check->name . ' Added to Cart']);
}

? 关键注意事项

掌握 ->exists() 的正确调用位置,是写出高效、可读、健壮 Laravel 查询的基础能力之一。