web-dev-qa-db-fra.com

Obtenir Laravel Modèles avec tous les attributs

Existe-t-il un moyen de récupérer un modèle dans Laravel avec tous les attributs, même s'ils sont nuls? Il semble que renvoyer un modèle avec les attributs qui ne sont pas nuls.

La raison en est que j'ai une fonction qui mettra à jour les attributs du modèle à partir d'un tableau, si les attributs existent dans le modèle. J'utilise la fonction property_exists () pour vérifier le modèle s'il possède un attribut particulier avant de le définir. La clé de tableau et l'attribut de modèle sont censés correspondre, c'est donc comment cela fonctionne. 

Cela fonctionne correctement si le modèle a déjà les attributs définis, car l'attribut existe et prend la valeur du tableau. Mais rien ne sera mis à jour ou défini si l'attribut était précédemment nul, car la vérification de property_exists () échoue.

Ce qui se passe finalement, c’est que j’ai un seul tableau d’attributs, puis peut-être deux modèles. Et je lance ma fonction setter, en passant dans le tableau d'attributs, et chacun des objets dans des appels séparés. Si le modèle a une propriété correspondante, elle est mise à jour.

13
kenshin9

Voici deux façons de le faire. Une méthode consiste à définir les valeurs d'attribut par défaut dans votre modèle.

protected $attributes = ['column1' => null, 'column2' => 2];

Ensuite, vous pouvez utiliser la méthode getAttributes() pour obtenir les attributs du modèle.

Si vous ne voulez pas définir les attributs par défaut, j’ai écrit une méthode rapide qui devrait fonctionner.

public function getAllAttributes()
{
    $columns = $this->getFillable();
    // Another option is to get all columns for the table like so:
    // $columns = \Schema::getColumnListing($this->table);
    // but it's safer to just get the fillable fields

    $attributes = $this->getAttributes();

    foreach ($columns as $column)
    {
        if (!array_key_exists($column, $attributes))
        {
            $attributes[$column] = null;
        }
    }
    return $attributes;
}

Fondamentalement, si l'attribut n'a pas été défini, cela ajoutera une valeur null à cet attribut et vous le renverra sous forme de tableau.

14
Thomas Kim
$model->getAttributes();

Ci-dessus retournera un tableau d'attributs bruts (tels que stockés dans la table de base de données)

$model->toArray() 

Ci-dessus renverra tous les attributs bruts, mutés (si utilisés) et ajoutés du modèle.

J'espère que ça vous aidera !!

5
Mahesh Yadav

Et si vous déclariez explicitement tous les champs que vous voulez récupérer.

public function getSomeModelFromArray(Request $request)
{
    // This will only give back the columns/attributes that have data.
    // NULL values will be omitted doing it this way.
    //$model = $request->all();

    // However by declaring all the attributes I want I can get back 
    // columns even if the value is null. Additional filtering can be 
    // added on if you still want/need to massage the data.
    $model = $request->all([
        'id',
        'attr1',
        'attr2',
        'attr3',
        //...
    ]);

    //...

    return $model;
}

Joli exemple générique, mais j'espère que quelqu'un trouvera cela utile.

0
Anovative

Mettre à jour:

Si vous essayez de faire cela après une instanciation comme ceci:

$model = new Model;

alors veuillez différer de la réponse de Thomas Kim.

Sinon: Vous pouvez utiliser la méthode toArray() ou getArributes() sur l'instance de modèle, qui rendrait tous les attributs, y compris les valeurs NULL. Ensuite, vous pouvez utiliser array_key_exists pour vérifier.

Ainsi:

if (array_key_exists('foo', $model->getAttributes())) {
    $model->foo = 'new value';
}
0
tam5