2015-11-16 2 views
0

контроллерLaravel возвращает неопределенное значение смещение 0 при попытке печати из массива

$new_products = Product::with('images')->orderBy('created_at', 'desc')->take(10)->get(); 
return view('site/home', compact('new_products')); 

Посмотреть

{{ $new_product->images[0]->image_name }} 

Это дает мне ошибку не определено смещение 0. Как напечатать значения изображений?

значения, возвращаемые на dd($new_products) enter image description here

ответ

1

Если вы хотите, чтобы получить первый элемент, вы можете использовать метод first.

{{ $new_product->images->first()->image_name }} 

У вас также есть метод offsetGet получить элемент по заданному смещению.

{{ $new_product->images->offsetGet(0)->image_name }} 

Вы можете также цикл по коллекции, хотя и делают это:

@foreach ($new_product->images as $image) 
    {{ $image->image_name }} 
@endforeach 

Примечание: первые два метода будет работать, только если продукты имеют изображения. Если они этого не сделают, то Laravel вернет пустую коллекцию. Третий метод циклизации в коллекции будет работать во всех случаях.

Если вы хотите, чтобы у продуктов были изображения, вы можете использовать метод has.

$new_products = Product::with('images')->has('images')->orderBy('created_at', 'desc')->take(10)->get(); 

Это приведет только к возврату продуктов, имеющих хотя бы одно изображение.

Документы по методам сбора: http://laravel.com/docs/master/collections#method-first

Docs на отношениях: http://laravel.com/docs/5.1/eloquent-relationships

+0

только третье решение работает. Первое решение дает «Попытка получить свойство не-объекта», а вторая дает «неопределенное смещение 0» –

+0

@AbelD Возможно ли, что некоторые из ваших продуктов не имеют изображений? В этом случае первые два решения не будут работать. Третий будет работать во всех случаях.Метод 'with' не гарантирует, что у продуктов есть изображения. Он может возвращать пустую коллекцию. –

+0

Правильно, вторая доза продукта не имеет изображений. Дай мне проверить. –

0

Из вне его кажется, что $ new_product также массив из двух элементов,

{{$ new_product [0] -> изображений [0] -> имя_образ}}

Edit: Томас Ким имеет лучший ответ

+0

его от @foreach ($ new_products as $ new_product) –

0

ваших отношений Типов на (images) является объектом сбора, если вы all() метода на что тогда вы получите базовый массив так, то вы можете получить доступ к любому элементу из массива с помощью index:

{{ $new_product->images->all()[0]->image_name }} 

Также toArray() метода будет работать:

{{ $new_product->images->toArray()[0]['image_name'] }} 

Итак, передайте массив на свое вид, например $new_product->all(), или зациклируйте его. Вы можете проверить documentation here для получения дополнительной информации о Collection объект в Laravel.

+0

дает ошибки 'undefined offset 0'. –

+0

Упс! Моя ошибка, я забыл изменить нотацию объекта на нотацию массива при использовании 'toArray()', но 'all()' должен работать так, как он есть в примере, так или иначе. –

Смежные вопросы