删除购物车时触发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
相关产品推荐
相关产品推荐

