You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

删除购物车时触发Call to a member function delete() on string错误的解决方法

问题解决:Call to a member function delete() on string

错误原因

你在foreach ($carts as $cart => $items)循环里,$cart是groupBy生成的分组键(也就是商店名称,字符串类型),而不是Cart模型的实例,所以调用$cart->delete()会触发「在字符串上调用对象方法」的错误。

解决方案

1. 修正循环变量名,批量删除分组内的购物车记录

把循环里的变量名改为更清晰的命名(避免和外层的$cart变量混淆),然后直接对分组后的购物车集合调用批量删除方法。

2. 优化订单查询逻辑

原代码里foreach ($orders->take(1) as $order)完全没必要,直接获取最新一条订单即可,减少不必要的循环。

修正后的完整代码

public function storebilling(Request $request, $id)
{
    // 获取当前用户对应店铺的所有购物车记录
    $cartItems = Cart::where('user_id', Auth::user()->id)->where('store_id', $id)->get();
    // 按商店名称分组
    $groupedCarts = $cartItems->groupBy(fn ($item) => $item->Product->Store->name);

    // 获取用户最新的订单(直接取第一条,不用get()再循环)
    $latestOrder = Orders::where('user_id', Auth()->user()->id)->latest()->first();

    // 检查是否有购物车记录
    if ($groupedCarts->isNotEmpty()) {
        foreach ($groupedCarts as $storeName => $items) {
            foreach ($items as $item) {
                if ($latestOrder) {
                    OrderDetails::create([
                        'product_id' => $item->product_id,
                        'order_id' => $latestOrder->id,
                        'price' => $item->product->price * ((100 - $item->product->discount) / 100),
                        'qty' => $item->qty,
                        'discount' => $item->product->discount
                    ]);
                }
            }
            // 批量删除当前分组下的所有购物车记录
            $items->each->delete();
        }
    } else {
        return redirect('/cart');
    }

    // 可添加后续跳转逻辑,比如跳转到订单详情页
    // return redirect()->route('orders.show', $latestOrder->id);
}

额外优化建议

  • 用集合的isNotEmpty()/isEmpty()方法替代if ($carts),判断逻辑更准确。
  • 若$latestOrder可能不存在,建议先做判断处理(比如提示用户先创建订单),避免创建OrderDetails时出错。

内容的提问来源于stack exchange,提问作者baihaqi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.25 09:24:28