【问题标题】:Laravel / Cannot access protected property Illuminate\Database\Eloquent\Collection::$itemsLaravel / 无法访问受保护的属性 Illuminate\Database\Eloquent\Collection::$items
【发布时间】:2016-08-27 02:53:21
【问题描述】:

我仍在学习 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 个存储库,但我无法检索属于这 2 个存储库的多个项目。我已经尝试在存储库上使用@foreach 来运行两者并将项目推送到一个空数组中,但我只得到最后一个项目。是否有我遗漏的查询技术/步骤?

【问题讨论】:

    标签: php arrays laravel collections eloquent


    【解决方案1】:

    $repositories 是集合而不是模型。所以你不应该调用 $items 属性,因为它是受保护的。

    我知道您正在寻找项目关系,所以...您需要遍历 $repositories 和每个 $repository $item ,例如:

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

    并从控制器中删除它:

    $items = $repositories-&gt;items;

    【讨论】:

    • 非常感谢您的成功。然而,我试图更清楚地理解这一点。所以......控制器中的实例化对象可以访问其所属方法。利用这种方法,我们可以创建关联模型的新实例。但是,当我们对 hasMany 执行相同操作时,我们正在检索一个集合。那么你会建议我避免从集合中获取集合吗?这是不好的做法,我应该避免这种情况还是完全可以?
    • 你会建议我在我的 'items' 表上放一个 'circle_id' 外键吗?这样我就可以获取与相关圆形模型相关联的所有项目,而不是创建存储库的实例并将其进一步归结为项目实例,或者这是一种不好的做法?
    猜你喜欢
    • 2013-06-16
    • 2018-10-22
    • 2016-07-08
    • 2021-12-04
    • 2014-11-23
    • 2017-03-05
    • 2016-06-02
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多