Подтвердить что ты не робот

Фильтрация данных коллекции 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 при фильтрации исходной коллекции , Спасибо заранее:)

4b9b3361

Ответ 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();