Home > Net >  Property [group] does not exist on this collection instance
Property [group] does not exist on this collection instance

Time:03-15

I have retrieved an instance of a product item at blade, so when I do dd($product), I get this result:

enter image description here

And the Product Model is connected to GroupProduct Model like this:

public function groupproducts()
{
   return $this->hasMany(GroupProduct::class,'product_id','id');
}

So at group_product table, the product has a custom group_id like this:

enter image description here

So when I do dd($product->groupproducts); I get this result properly:

enter image description here

Then at the Model GroupProduct, I've added these two relationships:

public function product()
{
    return $this->belongsTo(Product::class,'product_id','id');
}

public function group()
{
    return $this->belongsTo(Group::class,'group_id','id');
}

Now I need to access the name of the group that comes with the retrieved product_id, but when I try this:

dd($product->groupproducts->group->name);

I get this error:

Property [group] does not exist on this collection instance.

However the relationships seems to be applied and it should be showing the name of group...

So what's going wrong here? How can I fix this issue?


UPDATE #1:

Controller:

public function addAttribute(Product $product)
{
        return view('admin.products.addAttribute', compact('product'));
}

CodePudding user response:

$product->groupproducts is a collection(array) of products. You can do:

dd($product->groupproducts->first()->group->name);

This will get first element from collection which is instance of Group class.

CodePudding user response:

Your relation from your product model to the group products model is a one to many. This means, that even if there's only one result, you will be receiving a collection.

You can see in your own screenshot that the return value of $product->groupproducts is an instance of a collection with 1 item.

If you only ever want the first, you should change your relation to a one to one.

However, if you just want the first in this particular case, you should call for the first on the query instance, not on the collection instance.

So $product->groupproducts()->first()->group->name. This way you don't load x amounts, but instead only 1, from your database, which is much faster.

CodePudding user response:

you have to use nested relationship:

1- you can use it in your Model via:

public function groupproducts()
{
   return $this->hasMany(GroupProduct::class,'product_id','id')->with('group');;
}

2- you can use it in your controller:

Products::with('groupproducts.group')->get()

REFRENCE

  • Related