Laravel报错:BadMethodCallException,Collection::save方法不存在
解决Illuminate\Database\Eloquent\Collection::save方法不存在的错误
错误原因
Auth::user()->orders返回的是Eloquent集合对象,而集合类没有save()方法。save()是单个Eloquent模型的方法,你误用了集合来调用模型专属方法。
解决方案
将代码中的:
Auth::user()->orders->save($order);
修改为:
Auth::user()->orders()->save($order);
原理说明
Auth::user()->orders:直接访问关联属性,会立即执行数据库查询,返回该用户所有订单的集合(Collection)Auth::user()->orders():调用关联关系方法,返回的是关联查询构造器,它提供了save()方法,能自动将新的Order模型与当前用户关联,并完成数据库保存操作。
修正后的完整控制器代码片段
public function checkout(Request $request) { $this->validate(request(), [ 'name' => 'required|string', 'phonenumber' => 'required|regex:/^([0-9\s\-\+\(\)]*)$/|min:8', 'country' => 'required|string', 'city' => 'required|string', 'address' => 'required', 'zipcode' => 'required|digits:5', 'creditcardnumber' => 'required|digits:16', 'expiremonth' => 'required|digits:2', 'expireyear' => 'required|digits:2', 'cvc' => 'required|digits:3', ]); if(!Session::has('cart')){ return view('cart.index'); } $oldCart = Session::get('cart'); $cart = new Cart($oldCart); foreach ($cart->items as $order) { Product::where('id',$order['product_id']) ->decrement('quantity'); } $order = new Order(); $order->cart = serialize($cart); $order->address = $request->input('address'); $order->name = $request->input('name'); $order->phonenumber = $request->input('phonenumber'); $order->city = $request->input('city'); $order->country = $request->input('country'); $order->zipcode = $request->input('zipcode'); // 修正后的代码 Auth::user()->orders()->save($order); Session::forget('cart'); return redirect()->route('home.index')->with('success','Successfully purchased the products!'); }
内容的提问来源于stack exchange,提问作者lines
相关产品推荐
相关产品推荐

