Студия разработки сайтов и приложений

Netspark.ru

Заметки и разработки

Drupal

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);
}

Комментарии