2013-07-19 3 views
6

Почему я не могу получить доступ к собственности в загруженном senario?Laravel 4 Eager Loading «Undefined Property»

Я пытаюсь получить доступ к местоположению фотографии для моей модели объектов. У них много: много отношений. Когда я загружаю данные объекта с помощью

$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. Чтобы получить доступ к нему так, как вы хотите, вы должны добавить первый() метод, как говорит Атрим, вы даже можете отказаться от метода get(). Только я предлагаю сделать это в контроллере.

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

{{ $facilities->location }} 
0

Спасибо Altim, я просто ударил эту проблему, и вложенный foreach является одним из решений. Тем не менее, я поделюсь с вами, ребята, решение, которое я использовал в конце.

Вместо встроенного foreach или даже для загружаемого загрузчика я использовал Builder Builder. В моем случае:

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

Это позволило мне использовать один Еогеасп, и все данные на том же уровне, в моем случае, например, было бы что-то вроде:

@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