6

为什么我无法在急切加载的场景中访问该属性?

我正在尝试访问我的设施模型的照片位置。他们有很多:很多的关系。当我使用加载设施信息时

$facilities = Facility::with('photos')->get();

当我尝试访问

foreach($facilities as $facility)
{
    echo $facility->photos->id;
}

我明白了Undefined property: Illuminate\Database\Eloquent\Collection::$id

如果我回声$facilities->photos,我最终会得到。

[{"id":"3",
"name":null,
"location":"facilities\/facility1.jpg\r",
"created_at":"2013-07-18 14:15:19",
"deleted_at":null,
"updated_at":null,
"pivot":{"facility_id":"5","photo_id":"3"}}]

访问此数组中任何属性的最佳方法是什么?

4

3 回答 3

18

通过急切加载,photos您将获得一个photos集合,并且为了获得您需要遍历photos集合的照片,例如

foreach($facilities as $facility)
{

 foreach($facility->photos as $photo)
 {
    echo $photo->id;
 }

}

如果您只想要第一张照片,您可以通过调用first()集合上的方法来获取它

foreach($facilities as $facility) 
{
  $facility->photos->first()->id;
}
于 2013-07-19T14:39:07.067 回答
2

从数据库接收到的是一个包含一个对象的数组。这就是为什么 foreach 起作用的原因。要以您希望的方式访问它,您应该添加 first() 方法,就像 Atrim 所说的那样,您甚至可以删除 get() 方法。只有我建议在控制器中执行此操作。

$facilities = Facility::with('photos')->first();

{{ $facilities->location }}
于 2013-09-22T13:56:58.440 回答
0

谢谢Altim,我也遇到了这个问题,嵌套的foreach是解决方案之一。不过,我将与大家分享我最后使用的解决方案。

我没有使用嵌套的 foreach 甚至是 Eager loader,而是使用了 Join Query Builder。就我而言:

$posts = DB::table('posts')
                ->leftJoin('users', 'posts.user_id', '=', 'users.id')
                ->get();

这使我可以使用一个 foreach,并且所有数据都处于同一级别,在我的情况下,例如:

@foreach ($posts as $post)
  <p>{{ $post->first_name }}</p> # From users table
  <p>{{ $post->title }}</p> # From posts table
  <p>{{ $post->body }}</p>
@endforeach

也许它没有准确地回答这个问题,但希望它对像我这样最终解决这个特定问题的其他人有所帮助。

于 2014-07-21T04:18:25.990 回答