为什么我无法在急切加载的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"}}]
访问此阵列中任何属性的最佳方式是什么?
答案 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
也许它并没有完全回答这个问题,但希望它能帮助像我一样最终出现在这个特定问题中的其他人。