Я пишу 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);