Laravel 4急切加载“未定义属性”

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"}}]

如何访问该数组中的任何属性是最好的方式?

3个回答

18
使用渴望式加载(eager loading),您可以获得一个 photos 集合,为了获取照片,您需要遍历 photos 集合,例如:
foreach($facilities as $facility)
{

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

}

如果您只想获取第一张照片,可以在集合上调用first()方法来获取它。
foreach($facilities as $facility) 
{
  $facility->photos->first()->id;
}

1
$facility->photos()->first()->id; 应该改为 $facility->photos->first()->id;(在 photos 上不需要括号)。 - Alexandre Danault

2
从数据库中接收到的是一个包含一个对象的数组。这就是为什么可以使用foreach循环的原因。如果想要以你想要的方式访问它,应该添加first()方法,就像Atrim所说的那样,甚至可以省略get()方法。但我建议在控制器中执行此操作。
$facilities = Facility::with('photos')->first();

{{ $facilities->location }}

0

感谢Altim,我也遇到了这个问题,嵌套的foreach是其中之一的解决方案。不过,最终我会和大家分享我使用的解决方案。

与其使用嵌套的foreach或者急切加载器,我使用了一个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

也许这并没有直接回答这个问题,但我希望对像我一样最终落到这个特定问题上的其他人有所帮助。

如果有人知道一种不使用查询构建器的干净的左连接方法,更符合Laravel方式的话,我会很乐意了解它 ;) - AZReed

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