web-dev-qa-db-ja.com

$ collection-> filter()を使用した雄弁なコレクションデータのフィルタリング

コレクション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モデルインスタンスの配列が必要です。前もって感謝します :)

38
Tenzoru

コレクションのfilterメソッドは、基礎となる配列で_array_filter_を呼び出し、 PHP docs に従って)、配列キーを保持します。その結果、配列は配列ではなくJavaScriptオブジェクトに変換されます。

コレクションでvalues()を呼び出して、基になる配列のキーをリセットします。

_$filtered_collection = $collection->filter(function ($item) {
    return $item->isDog();
})->values();
_
102
Joseph Silber

Laravel documentation の状態を考慮して、JSONに変換するだけです:

注:コレクションをフィルタリングしてJSONに変換するときは、最初にvalues関数を呼び出して配列のキーをリセットしてください。

したがって、最終的なコードは次のようになります。

$filtered_collection->values()->toJson();
7
totymedli