2013-07-19 11 views
6

Dlaczego nie mogę uzyskać dostępu do nieruchomości w gorliwie załadowanym senario?Laravel 4 Eager Ładowanie "Niezdefiniowana właściwość"

Próbuję uzyskać dostęp do lokalizacji zdjęć dla mojego modelu obiektów. Mają stosunek Wiele: Wiele. Kiedy załadować informacje o obiekcie przy użyciu

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

gdy próbuję uzyskać dostęp

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

uzyskać Undefined property: Illuminate\Database\Eloquent\Collection::$id

Gdybym echo $facilities->photos I kończyć.

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

Jaki jest najlepszy sposób uzyskania dostępu do dowolnej właściwości w tej macierzy?

Odpowiedz

18

Z chęcią załadowania photos otrzymujesz kolekcję photos, a aby uzyskać zdjęcie, musisz wykonać iterację kolekcji photos

foreach($facilities as $facility) 
{ 

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

} 

Jeśli chcesz tylko właśnie pierwsze zdjęcie można je dostać poprzez wywołanie metody first() sprawie zbierania

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

'$ facility-> photos() -> first() -> id;' powinno być '$ facility-> photos-> first() -> id;' (bez nawiasów na zdjęciach). –

+0

@ Alex-Info.net dzięki, poprawione. – Altrim

2

Co jest odbierany z bazy danych jest tablicą z jednego obiektu. Dlatego działa foreach. Aby uzyskać do niego dostęp tak, jak chcesz, powinieneś dodać metodę first(), tak jak mówi Atrim, możesz nawet upuścić metodę get(). Tylko proponuję to zrobić w kontrolerze.

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

{{ $facilities->location }} 
0

Dzięki Altim, właśnie uderzyłem w ten problem, a zagnieżdżone foreach jest jednym z rozwiązań. Niemniej jednak, podzielę się z Wami rozwiązaniem, którego użyłem na końcu.

Zamiast zagnieżdżonego foreach lub nawet gorliwego programu ładującego użyłem narzędzia Join Query Builder. W moim przypadku:

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

ten pozwolił mi użyć jednego foreach, a wszystkie dane znajdują się na tym samym poziomie, w moim przypadku na przykład byłoby coś jak:

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

Może to nie jest odpowiadając dokładnie na to pytanie, ale mam nadzieję, że pomoże to innym osobom, takim jak ja, które zakończyły się tym konkretnym pytaniem.

+0

Jeśli ktoś zna sposób na czyste lewe sprzężenie bez budowania zapytań, w bardziej larwalny sposób, chciałbym go znać;) – AZReed