Laravel Eloquent toArray не использует квадратные скобки

Я пишу api и пытаюсь преобразовать несколько результатов в JSON. Когда красноречивый результат преобразуется в массив, я ожидаю что-то вроде этого:

[ { "id": "0", ... }, { "id": "", ... }, ] 

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

 "0":{ { "id": "0", ... } }, "1":{ { "id": "1", ... } } 

Вот функция:

 $results = \App\Event::with('sandboxes')->get()->sortBy('start_time')->forPage($pageNum,$perPage); return response()->json(array( "events" => $page, )); 

Как я могу заставить Laravel дать мне правильный массив?

Когда вы впервые получаете свои события, ваша Collection выглядит примерно так:

 [ 0 => Event1, 1 => Event2, 2 => Event3 ] 

Это правильно индексированный числовой массив и может быть представлен как массив в JSON. Однако, как только вы получите свою Collection , вы вызываете на ней sortBy() , которая сортирует элементы в Collection . Эта сортировка переставляет как ключи, так и значения элементов внутри массива. На данный момент ваша Collection может выглядеть примерно так:

 [ 1 => Event2, 0 => Event1, 2 => Event3 ] 

Это не правильно индексированный числовой массив и не может быть представлен как массив в JSON. Этот массив должен быть представлен как объект, который вы видите.

Чтобы получить ожидаемые результаты, вам необходимо повторно ввести элементы в Collection после сортировки. Вы можете сделать это с помощью метода values() в Collection (который просто вызывает array_values() в массиве внутренних элементов).

Когда вы снова закроете свою коллекцию, она будет выглядеть примерно так:

 [ 0 => Event2, 1 => Event1, 2 => Event3 ] 

Теперь это правильно индексированный числовой массив и может быть представлен как массив в JSON.

Итак, ваш код должен выглядеть примерно так:

 $results = \App\Event::with('sandboxes') ->get() ->sortBy('start_time') ->values() // re-key the items in the collection after sorting ->forPage($pageNum, $perPage);