属性 [group] 在此集合实例上不存在

Property [group] does not exist on this collection instance

我在 blade 上检索了一个产品项目的实例,所以当我这样做时 dd($product),我得到了这个结果:

并且 Product 模型连接到 GroupProduct 模型,如下所示:

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

所以在 group_product table,产品有这样的自定义 group_id

所以当我这样做时 dd($product->groupproducts); 我正确地得到了这个结果:

然后在模型 GroupProduct 中,我添加了这两个关系:

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

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

现在我需要访问检索到的 product_id 附带的组的名称,但是当我尝试这样做时:

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

我收到这个错误:

属性 [组] 在此集合实例上不存在。

但是这些关系似乎已应用并且应该显示组名...

所以这里出了什么问题?我该如何解决这个问题?


更新#1:

控制器:

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

$product->groupproducts 是产品的集合(数组)。 你可以这样做:

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

这将从集合中获取第一个元素,它是 Group class.

的实例

你必须使用嵌套关系:

1- 您可以通过以下方式在您的模型中使用它:

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

2- 你可以在你的控制器中使用它:

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

REFRENCE

您的产品模型与组产品模型的关系是 one to many。这意味着,即使只有一个结果,您也会收到一个集合。

您可以在自己的屏幕截图中看到,$product->groupproducts 的 return 值是包含 1 个项目的集合实例。

如果您只想要第一个,则应将关系更改为 one to one

但是,如果在这种特殊情况下您只想要第一个,则应该在 query 实例上调用第一个,不是 集合 实例上。

所以$product->groupproducts()->first()->group->name。这样您就不会从数据库中加载 x 个数量,而只会加载 1 个数量,速度要快得多。