2013-07-19 10 views
6

Warum kann ich nicht auf die Eigenschaft in einem eifrig geladenen Senario zugreifen?Laravel 4 Eager Wird geladen "Nicht definierte Eigenschaft"

Ich versuche, auf den Fotostandort für mein Anlagenmodell zuzugreifen. Sie haben eine Viele: Viele Beziehung. Wenn ich laden Sie die Informationen werden täglich

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

Wenn ich versuche, den Zugriff auf

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

ich die Undefined property: Illuminate\Database\Eloquent\Collection::$id

bekommen Wenn ich $facilities->photos echo ich am Ende mit.

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

Was ist der beste Weg, um auf eine Eigenschaft in diesem Array zuzugreifen?

Antwort

18

Mit eifrigen Laden der photos erhalten Sie eine photos Sammlung und um das Foto zu erhalten, müssen Sie durchlaufen die photos Sammlung z.

foreach($facilities as $facility) 
{ 

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

} 

Wenn Sie gerade erst das erste Foto wollen, dass es durch den Aufruf der Methode first() auf der Sammlung

foreach($facilities as $facility) 
{ 
    $facility->photos->first()->id; 
} 
+1

'$ facility-> fotos() -> first() -> id;' sollte '$ facility-> photos-> first() -> id;' (keine Klammer in Fotos) sein. –

+0

@ Alex-Info.net danke, korrigiert. – Altrim

2

Was aus der Datenbank erhalten wird, ist ein Array mit einem Objekt erhalten. Deshalb arbeitet eine foreach. Um darauf zuzugreifen, wie Sie möchten, sollten Sie die erste() Methode hinzufügen, genau wie Atrim sagt, Sie können sogar die Methode get() löschen. Nur würde ich vorschlagen, es in der Steuerung zu tun.

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

{{ $facilities->location }} 
0

Dank Altim, ich habe gerade dieses Problem auch und die verschachtelte foreach ist eine der Lösungen. Nichtsdestotrotz werde ich mit euch die Lösung teilen, die ich am Ende benutzt habe.

Anstatt der verschachtelten foreach oder sogar der eifrige Loader, habe ich einen Join Query Builder verwendet. In meinem Fall:

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

Die erlaubten mir ein foreach zu verwenden, und alle Daten sind auf dem gleichen Niveau, in meinem Fall zum Beispiel, wie etwas wären:

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

Vielleicht ist es nicht Beantworten Sie diese Frage genau, aber ich hoffe, es hilft anderen wie mir, die in dieser speziellen Frage endete.

+0

Wenn jemand eine Möglichkeit kennt, eine saubere Link-Verknüpfung ohne Abfrage-Generator zu erstellen, würde ich es gerne kennenlernen;) – AZReed

Verwandte Themen