2013-07-19 50 views
6

爲什麼我無法在渴望加載的senario中訪問屬性?Laravel 4渴望加載「未定義的屬性」

我試圖訪問我的設施模型的照片位置。他們有許多關係。當我使用加載

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

什麼是訪問此數組中的任何屬性的最佳方式?

回答

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

'$ facility-> photos() - > first() - > id;'應該是'$ facility-> photos-> first() - > id;'(照片上沒有括號)。 –

+0

@ Alex-Info.net謝謝,糾正。 – Altrim

2

得到它是一個對象的數組。這就是爲什麼一個foreach工作。要以您想要的方式訪問它,您應該像Atrim所說的那樣添加first()方法,您甚至可以刪除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 

也許它不是完全回答這個問題,但希望對於像我這樣的人來說,這有助於解決這個特定問題。

+0

如果有人知道如何在沒有查詢構建器的情況下做一個乾淨的左連接,以更輕鬆的方式,我很想知道它;) – AZReed