EDIT: typos corrected (made while translating some of the code)
I’m building a shopping cart with Laravel 6.11 (MAMP). I am getting a couple of errors that are driving me nuts. Please help! First I’ll give you the code, afterwards the errors:
Table carts:
id order_date arrived_date status user_id
Table cart_details:
id cart_id product_id quantity discount
Please note that the two tables are EMPTY at this point, no records inserted just yet.
A cart can have many cartdetails. So in Cart.php I have:
class Cart extends Model { public function details() { return $this->hasMany(CartDetail::class); } }
CartDetailController contains:
class CartDetailController extends Controller { //let's insert data in cart_details so the order can be created public function store(Request $request) { $cartDetail = new CartDetail(); $cartDetail->cart_id = auth()->user()->cart_identification;/* cart_id from the logged user. In User.php I have getCartIdentifitacionAttribute, I'm going to put the code right after this */ $cartDetail->product_id = $request->product_id; $cartDetail->quantity = $request->quantity; $cartDetail->save(); return back(); } }
In User.php I have:
public function carts() { return $this->hasMany(Cart::class); //a user can have many carts } public function getCartIdentificationAttribute() { $cart = $this->carts()->where('status','Active')-> first(); if($cart) { return $cart->id; } else// if there's no cart, let's create a new one { $cart = new Cart(); $cart->status = 'Active'; $cart->user_id = $this->id; $cart->save(); return $cart->id; } }
The .blade (which will show the administrator the details of the order):
@foreach (auth()->user()->cart_identification->details as $detail) <ul> <li>{{ $detail }}</li> </ul> @endforeach
And now the errors, two… certainly related 🙁
In a product page, after hitting “Add to the Cart”:
BadMethodCallException Call to undefined method IlluminateDatabaseEloquentRelationsHasMany::fisrt()
If I print $this->carts()->where('status','Active')
it works, it is when I add ->fist()
that the error shows
When accesing the blade as an administrator would do to deal with the order:
FacadeIgnitionExceptionsViewException Call to undefined method IlluminateDatabaseEloquentRelationsHasMany::fisrt() (View: /Applications/MAMP/htdocs/app-shop/resources/views/home.blade.php)
If I print auth()->user()
it works, it is auth()->user()->cart_identification
that causes the error.
What am I missing??
Thanks a ton!!
Advertisement
Answer
I think you have a typo error
.
It should be
$cart = $this->carts()->where('status','Active')->first();
Not
$cart = $this->carts()->where('status','Active')->fisrt();
And in your model change your code to this.
public function scopeCartIdentification() { $cart = $this->carts()->where('status','Active')->first(); if($cart) { return $cart->id; } else// if there's no cart, let's create a new one { $cart = new Cart(); $cart->status = 'Active'; $cart->user_id = $this->id; $cart->save(); return $cart->id; } }
and call in to your controller like this
public function store(Request $request) { $cartDetail = new CartDetail(); $cartDetail->cart_id = auth()->user()->CartIdentification();/* cart_id from the logged user. In User.php I have getCartIdentifitacionAttribute, I'm going to put the code right after this */ $cartDetail->product_id = $request->product_id; $cartDetail->quantity = $request->quantity; $cartDetail->save(); return back(); }