В коллекции Laravel 5 как вы возвращаете массив объектов вместо массива массивов?

Я использую 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

Как получить массив моделей вместо массива моделей?

5

Решение

Согласно Документы:

$array = $collection->all();

«Метод all возвращает базовый массив, представленный коллекцией.»

8

Другие решения

Ваш код просто в порядке, кроме как вам не нужно звонить 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 не всегда отображает простые структуры данных, которые вы можете ожидать.

4

Разобрался с проблемой. Я явно определял атрибуты в модели. Laravel использует __get () определенным образом, что приводит к переопределению переданных параметров независимо от того, какие атрибуты определены явно.

Другими словами, я получал нулевые значения в партиале, потому что информация, которую я передавал в партиал, была переопределена.

0
По вопросам рекламы [email protected]