Допустим, вы из контроллера возвращали коллекцию моделей в JSON, вот так:
public function index() {
$posts = Post::all();
// что-то делаем с постами
return response()->json($posts, 200);
}
А на стороне фронт-энда работали с получившимся массивом, и всё было хорошо.
И вдруг в один не очень прекрасный день массив во фронт-энде внезапно превратился вот в такой объект:
{
1: {id: 1, ...},
2: {id: 5, ...},
3: {id: 6, ...},
4: {id: 12, ...},
// ...
}
И всякие там posts.forEach()
во фронт-энде сломались.
В первую очередь, нужно посмотреть на методы коллеций, применяемые к $posts
. Если вы использовали filter()
, или forget()
, или возможно reject()
, то эти методы сохраняют ключи элементов получившейся коллекции в тех значениях, что были до изменений. То есть индексированный массив превращается в ассоциативный. Вот чтобы сохранить эти ключи, в JSON и отправляется такой дурацкий объект.
А чтобы сбросить ключи и снова сделать массив индексированным, нужно воспользоваться методом values()
:
public function index() {
$posts = Post::all();
$filtered_posts = $posts->filter(function (Post $post) {
return $post->published;
});
return response()->json($fitlered_posts->values(), 200);
}