Допустим, вы из контроллера возвращали коллекцию моделей в 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); }