Если я запустил $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()
в вашей коллекции должен удалить ключи и объединить все их значения в одну коллекцию.