Home > database >  Laravel 9 hasMany relationship not working
Laravel 9 hasMany relationship not working

Time:05-29

I have a model with a relationship with another model, when calling the relationship in the controller it gives me

Exception: Property [products] does not exist on the Eloquent builder instance.

model:

public function products(): HasMany
{
    return $this->hasMany(CartProduct::class,'cart_id','id');
}

controller

public function showCartOfAuth()
{
    $id =auth()->guard('customers')->user()->id;
    $cart = Cart::where('customer_id',$id)->get();
    $products = Cart::where('customer_id',$id)->products->get();
    $response = [
        'cart' => $cart,
        'items' => $products
    ];
    return response($response,200);
}

CodePudding user response:

Can you try this, please: Cart::with('products')->where('customer_id',$id)->get();

CodePudding user response:

The way you have implemented requires atleast two database queries.

One: $cart = Cart::where('customer_id',$id)->get();

Two: Cart::where('customer_id',$id)->first()->products; //maybe a third query to fetch the products

For better performance you should

public function showCartOfAuth()
{
    $id =auth()->guard('customers')->user()->id;
    
    // Either Option 1
    // Possibly 2 database queries, one to fetch the Cart and another to fetch Products for the Cart
    $cart = Cart::where('customer_id',$id)->first();
    $products = $cart->products;
    $response = [
        'cart' => $cart,
        'items' => $products
    ];

    // OR Option 2
    // One database query using eager loading
    $cart = Cart::with('products')->where('customer_id', $id)->first();

    $response = ['cart' => $cart];
    return response($response,200);
}

If you use option 1 from above then instead of $items you can use $cart->products

  • Related