Фильтрация данных коллекции Eloquent с помощью $collection-> filter()
Я пытаюсь отфильтровать следующую коллекцию с помощью метода collection filter():
$collection = Word::all();
где вывод JSON выглядит следующим образом:
[
{
"id": "1",
"word": "dog",
"phonetic": "dog",
"mean": "pies",
"assoc": "some example text",
"author_id": "3",
"user_id": "3"
},
{
"id": "2",
"word": "sun",
"phonetic": "sun",
"mean": "słońce",
"assoc": "lorem ipsun dolor sit amet",
"author_id": "3",
"user_id": "2"
}, ...
]
Однако при фильтрации коллекции:
$filtered_collection = $collection->filter(function($item)
{
if($item->isDog())
{
return $item;
}
});
Отфильтрованный сборник JSON будет выглядеть следующим образом:
{"1":
{
"id": "1",
"word": "dog",
"phonetic": "dog",
"mean": "pies",
"assoc": "some example text",
"author_id": "3",
"user_id": "3"
},
"2":
{
"id": "2",
"word": "sun",
"phonetic": "sun",
"mean": "słońce",
"assoc": "lorem ipsun dolor sit amet",
"author_id": "3",
"user_id": "2"
}}
Как я могу сохранить исходный вывод JSON при фильтрации коллекции?
Я хотел бы иметь массив экземпляров модели Eloquent при фильтрации исходной коллекции
,
Спасибо заранее:)
Ответы
Ответ 1
Метод filter
коллекции вызывает array_filter
в базовом массиве, который в соответствии с документами PHP сохраняет ключи массива. Это приводит к тому, что ваш массив преобразуется в объект JavaScript вместо массива.
Вызвать values()
в своей коллекции на reset ключи в базовом массиве:
$filtered_collection = $collection->filter(function ($item) {
return $item->isDog();
})->values();
Ответ 2
Просто преобразуйте его в JSON с учетом того, что Документация Laravel гласит:
Примечание.. При фильтрации коллекции и ее конвертации в JSON попробуйте сначала вызвать функцию значений до reset ключей массива.
Таким образом, окончательный код:
$filtered_collection->values()->toJson();