2016-03-26 4 views
4

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

[ 
    { 
    "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, чтобы дать мне правильный массив?

ответ

3

При первом получить ваши события, ваш 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); 
Смежные вопросы