web-dev-qa-db-fra.com

Filtrage des données de collection Eloquent avec $ collection-> filter ()

J'essaie de filtrer la collection suivante à l'aide de la méthode filter collection ():

$collection = Word::all();

où la sortie JSON ressemble à ceci:

[
{
"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"
}, ...
]

Cependant, lors du filtrage de la collection:

$filtered_collection = $collection->filter(function($item)
    {
        if($item->isDog())
        {
            return $item;
        }
 });

La sortie JSON de la collection filtrée ressemblera à ceci:

 {"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"
 }}

Comment puis-je conserver la sortie JSON d'origine lors du filtrage d'une collection? J'aimerais avoir un tableau de mes instances de modèle Eloquent lors du filtrage de la collection d'origine. Merci d'avance :)

38
Tenzoru

La méthode filter de la collection appelle array_filter Sur le tableau sous-jacent qui, selon les PHP , préserve les clés du tableau. Cela entraîne ensuite la conversion de votre tableau en un objet JavaScript au lieu d'un tableau.

Appelez values() sur votre collection pour réinitialiser les clés du tableau sous-jacent:

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

Il suffit de le convertir en JSON en gardant à l'esprit ce que le documentation Laravel déclare:

Remarque: Lors du filtrage d'une collection et de sa conversion en JSON, essayez d'abord d'appeler la fonction values ​​pour réinitialiser les clés du tableau.

Le code final serait donc:

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