---
title: 'Laravel, коллекции и JSON'
url: 'https://graker.ru/news/2019/06/27/laravel-json-and-collections'
language: ru
type: post
author: 'Роман Грачев'
published: '2019-06-27T17:20:00+03:00'
updated: '2019-06-27T17:27:30+03:00'
categories:
  - Laravel
  - Программирование
---

# Laravel, коллекции и JSON

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