Я использую Laravel 5 и шаблон Blade. В представлении я хочу перебрать массив объектов Model, а не массив массивов. Если Я хотел бы перебрать массив массивов, я бы сделал следующее, что работает как ожидалось:
$models = Foo::where('id', '>', 5)->get();
return view('home.index', ['models' => $models->toArray()]);
Однако я хочу массив объектов с доступными свойствами. Если бы я должен был бежать:
$models = Foo::where('id', '>', 5)->get();
return view('home.index', ['models' => $models->all()]);
var_dump
будет выглядеть так:
object(Illuminate\Support\Collection)[164]
protected 'items' =>
array (size=3)
0 =>
object(App\Foo)[172]
public 'id' => null
public 'foo' => null
private 'created_at' => null
private 'updated_at' => null
protected 'connection' => null
protected 'table' => null
protected 'primaryKey' => string 'id' (length=2)
protected 'perPage' => int 15
public 'incrementing' => boolean true
public 'timestamps' => boolean true
protected 'attributes' =>
array (size=4)
'id' => int 1
'foo' => string 'Foo!' (length=4)
'created_at' => string '2015-02-27 15:44:09' (length=19)
'updated_at' => null
Модель не только в объекте «items», но и свойства не заполнены.
В представлении я хотел бы сделать что-то вроде этого:
@foreach ($models as $model)
@include('_partial') {
'id' => $model->id,
'foo' => $model->foo,
}
@endforeach
Как получить массив моделей вместо массива моделей?
Согласно Документы:
$array = $collection->all();
«Метод all возвращает базовый массив, представленный коллекцией.»
Ваш код просто в порядке, кроме как вам не нужно звонить toArray
на ваш результат Eloquent запроса. Позвольте мне объяснить, что делает код, чтобы вы могли понять, почему вам нужно следующее:
$models = Foo::where('id', '>', 5)->get();
return view('home.index', ['models' => $models]);
Первый государственный мемет Foo::where('id', '>', 5)->get();
возвращает значение типа Illuminate\Support\Collection
,
Тот Collection
класс содержит элементы коллекции в защищенном свойстве под названием $items
(как вы могли видеть из вашей свалки protected 'items' =>
), который имеет тип array
, Класс также реализует интерфейс под названием IteratorAggregate, Это означает, что любая переменная этого типа может быть повторена с использованием foreach
заявление.
В вашем случае это означает, что даже если $models
имеет тип Illuminate\Support\Collection
он будет вести себя как массив, когда вы перебираете его foreach
:
@foreach ($models as $model)
{
{{ $model->foo }}
}
Короче говоря Collection
является итеративным объектом, который можно рассматривать как массив, но лучше, чем массив, потому что if предлагает дополнительные методы, которые позволяют вам манипулировать элементами из коллекции. Вы можете проверить API коллекции чтобы увидеть полный список доступных методов.
Так что на самом деле вы получаете улучшенный массив моделей.
Кроме того, не волнуйтесь, что свойства не заполнены, они на самом деле заполнены, я просто думаю, что вы смотрите не в том месте.
Если вы внимательно посмотрите на свой var_dump
вы увидите, что у вас есть несколько строк, которые начинаются с public
, protected
или же private
, Эти ключевые слова означают, что эти строки содержат свойства объекта. В случае моделей Laravel Eloquent значения, извлеченные из базы данных, не сохраняются непосредственно в свойствах, которые называются как столбцы базы данных. Значения на самом деле хранятся в одном свойстве под названием attributes
и получаются с помощью магии PHP _get
. Посмотрите на комментарии к коду ниже:
object(Illuminate\Support\Collection)[164]
protected 'items' =>
array (size=3)
0 =>
object(App\Foo)[172]
public 'id' => null // <<< THE VALUES ARE
public 'foo' => null // <<< NOT STORED HERE
private 'created_at' => null
private 'updated_at' => null
protected 'connection' => null
protected 'table' => null
protected 'primaryKey' => string 'id' (length=2)
protected 'perPage' => int 15
public 'incrementing' => boolean true
public 'timestamps' => boolean true
protected 'attributes' =>
array (size=4)
'id' => int 1 // <<< THEY ARE HERE
'foo' => string 'Foo!' (length=4) // <<< AND HERE
'created_at' => string '2015-02-27 15:44:09' (length=19)
'updated_at' => null
Laravel проделывает много хитростей за кулисами, чтобы вы могли сделать все с помощью всего лишь нескольких строк кода. Вот почему var_dump
не всегда отображает простые структуры данных, которые вы можете ожидать.
Разобрался с проблемой. Я явно определял атрибуты в модели. Laravel использует __get () определенным образом, что приводит к переопределению переданных параметров независимо от того, какие атрибуты определены явно.
Другими словами, я получал нулевые значения в партиале, потому что информация, которую я передавал в партиал, была переопределена.