Laravel / 无法访问受保护的属性Illuminate\Database\Eloquent\Collection::$items

7

我仍在学习Laravel,使用eloquent运行我的查询。在我的应用程序中,用户可以属于一个圆圈。这个圆圈包含存储库,存储库又包含项目。我试图获取属于一个圆圈内不同存储库的所有项目。

用户模型:

public function circle () {
  return $this->belongsTo('App\Models\Circle');
}

圆形模型:

public function users () {
  return $this->hasMany('App\Models\User');
}

public function repositories () {
  return $this->hasMany('App\Models\Repository');
}

仓库模型:

public function items () {
  return $this->hasMany('App\Models\Item');
}

public function circle () {
  return $this->belongsTo('App\Models\Circle');
}

物品模型:

public function repository () {
  return $this->belongsTo('App\Models\Repository');
}

这里是我试图遍历所有项的标记:

  @foreach($items as $item)
      <span>{{ $item->name }}</span>
  @endforeach

我负责处理路由的控制器在这里:

function library () {
  $user = Auth::user();
  $circle = $user->circle;
  $repositories = $circle->repositories;
  $items = $repositories->items;
  return View('pages.library', compact(['user', 'circle', 'items']));
}

目前我可以检索到属于一个圈子的2个仓库,但是我无法检索到属于这两个仓库的多个项。我已经尝试了在仓库上使用@foreach循环来遍历并将项推入空数组,但最终只得到最后一项。我是否错过了查询技巧/步骤?

1个回答

4
"$repositories"是一个集合而不是模型,因此您不应该从中调用"$items"属性,因为它是受保护的。
我知道您正在寻找"items"关系,所以...您需要遍历"$repositories"和每个"$repository"的"$item",例如:
@foreach($repositories as $repository)
    @foreach($repository->items as $item)
        <span>{{ $item->name }}</span>
    @endforeach
@endforeach

从控制器中删除以下内容: $items = $repositories->items;

非常感谢,这个有效。我正在尝试更清楚地理解。所以...控制器中实例化的对象可以访问其属于方法。利用此方法,我们可以创建关联模型的新实例。但是,当我们对hasMany执行相同操作时,我们检索到一个集合。那么您是否建议我避免从集合中获取集合?这是不良做法吗?我应该避免这种情况还是完全可以接受的? - Eben Hafkamp
你会建议我在“items”表上放置一个“circle_id”外键吗?这样我就可以轻松获取与所讨论的圆模型相关联的所有项目,而不必创建存储库实例并进一步将其简化为项目实例,但这是不是不好的做法? - Eben Hafkamp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接