Laravel 4 Eager Loading“Undefined Property”

时间:2013-07-19 14:29:50

标签: php laravel laravel-4

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

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

加载设施信息时
$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 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

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

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

{{ $facilities->location }}

答案 2 :(得分:0)

感谢Altim,我也遇到了这个问题,嵌套的foreach就是其中一个解决方案。 不过,我会与你们分享我最后使用的解决方案。

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

$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

也许它并没有完全回答这个问题,但希望它能帮助像我一样最终出现在这个特定问题中的其他人。