2013-07-19 19 views
6

Perché non riesco ad accedere alla proprietà in un senario carico di volontà?Laravel 4 Eager Caricamento "Proprietà non definita"

Sto tentando di accedere alla posizione della foto per il mio modello di strutture. Hanno molti: molte relazioni. Quando carico informazioni impianto utilizzando

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

Quando provo ad accedere

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

ho la Undefined property: Illuminate\Database\Eloquent\Collection::$id

Se mi associo $facilities->photos io alla fine con.

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

Qual è il modo migliore per accedere a qualsiasi proprietà in questo array?

risposta

18

Con desiderosi di caricare il photos si ottiene una collezione photos e al fine di ottenere la foto è necessario scorrere l'insieme photos esempio

foreach($facilities as $facility) 
{ 

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

} 

Se desideri solo solo la prima foto si può ottenere chiamando il metodo first() sulla raccolta

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

'$ facility-> photos() -> first() -> id;' dovrebbe essere '$ facility-> photos-> first() -> id;' (nessuna parentesi sulle foto). –

+0

@ Alex-Info.net grazie, corretto. – Altrim

2

ciò che è ricevuto dalla banca dati è un array con un oggetto. Questo è il motivo per cui un foreach funziona. Per accedervi nel modo che preferisci, devi aggiungere il metodo first() proprio come dice Atrim, puoi anche eliminare il metodo get(). Solo io suggerirei di farlo nel controller.

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

{{ $facilities->location }} 
0

Grazie Altim, ho appena colpito anche questo problema e il foreach annidata è una delle soluzioni. Tuttavia, condividerò con voi la soluzione che ho usato alla fine.

Invece del foreach nidificato o anche del caricatore ansioso, ho utilizzato un generatore di query di join. Nel mio caso:

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

Questo mi ha permesso di usare un foreach, e tutti i dati sono allo stesso livello, nel mio caso per esempio sarebbe qualcosa di simile:

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

Forse non è rispondere esattamente a questa domanda, ma spero che aiuti gli altri come me che sono finiti in questa particolare domanda.

+0

Se qualcuno conosce un modo per eseguire un join a sinistra pulito senza il query builder, in un modo più laravel, mi piacerebbe saperlo;) – AZReed

Problemi correlati