Коллекция Laravel преобразует массив в объект

Если я запустил $collection->filter(myFilter) , Laravel делает это досадно, добавляя ключи к каждой модели в коллекции, например:

 { "4": { "myObject": "data" }, "7": { "myObject": "data" } } 

Как я могу избавиться от «4» и «7», так что это массив моих объектов?

Мой код, который работает:

 $obj = Cars::with('brand')->orderBy('id')->get(); return $obj->filter(function($value, $key) { return $value->display == true; }); 

    Проблема заключается в том, что метод filter() не переделывает базовый массив массивов. Итак, коллекция по-прежнему представляет массив, это просто, что ваш массив выглядит так:

     [ 4 => Object4, 7 => Object7, ] 

    Хотя это вполне допустимый массив в PHP, это не правильный массив в JSON. Поскольку это не может быть представлено как массив в JSON, он преобразуется в объект в JSON.

    Чтобы получить это правильно представленное как массив в JSON, вам просто нужно повторно установить массив Collection. Правильный метод для этого – метод values() . Все, что он делает, это array_values вызова в базовом массиве. Это приведет к тому, что вышеуказанный массив включит:

     [ 0 => Object4, 1 => Object7, ] 

    Теперь это правильный числовой индексный массив, который JSON может понимать и рассматривать как массив вместо объекта.

    Хотя flatten может работать в этом конкретном случае (ваша коллекция представляет собой коллекцию Eloquent Models), это на самом деле не правильный метод и может привести к непреднамеренным последствиям. Кроме того, он будет выполнять много дополнительной логики, которая не нужна. Лучше всего использовать правильный метод для того, чего вы пытаетесь достичь, и это метод values() .

     $obj = Cars::with('brand')->orderBy('id')->get(); return $obj->filter(function($value, $key) { return $value->display == true; }) ->values(); 

    Вызов flatten() в вашей коллекции должен удалить ключи и объединить все их значения в одну коллекцию.