92 votes

Comment définir la valeur par défaut d'un attribut dans un modèle Laravel ?

Comment définir la valeur par défaut d'un attribut sur un modèle Laravel ?

Dois-je définir la valeur par défaut lors de la création d'une migration ou dois-je la définir dans la classe du modèle ?

0 votes

145voto

Manish Points 1800

Vous pouvez également définir l'attribut Default dans Model>.

protected $attributes = [
        'status' => self::STATUS_UNCONFIRMED,
        'role_id' => self::ROLE_PUBLISHER,
    ];

Vous pouvez trouver les détails dans ces liens

1.) Comment définir une valeur d'attribut par défaut pour un modèle Laravel / Eloquent ?

2.) https://laracasts.com/index.php/discuss/channels/eloquent/eloquent-help-generating-attribute-values-before-creating-record


Vous pouvez également utiliser Accesseurs et mutateurs pour cela Vous pouvez trouver les détails dans la documentation de Laravel 1.) https://laravel.com/docs/4.2/eloquent#accessors-and-mutators

2.) https://scotch.io/tutorials/automatically-format-laravel-database-fields-with-accessors-and-mutators

3.) Accesseurs et mutateurs universels dans Laravel 4

0 votes

Merci, la définition de l'attribut par défaut fonctionne bien en tant que protected $attributes = [ 'status' => self::STATUS_UNCONFIRMED, 'role_id' => self::ROLE_PUBLISHER, ] ; mais en tant que Mutators cela ne fonctionne pas, par exemple public function setUserTypeAttribute($value){ $this->attributes['user_type'] = 'User' ; } je veux savoir s'il y a une différence entre ces approches, ou laquelle est la meilleure.

0 votes

Les deux sont meilleurs. C'est à vous de voir. Dans le mutateur, je vous ai donné un exemple où vous pouvez définir une valeur par défaut dans le cas de empty or custom condition faite.comme public function setUserTypeAttribute($value){ $this->attributes['user_type'] = empty($value) ? 'User' : $value; } J'espère que vous avez compris ce que je veux dire avec cet exemple.

0 votes

@Zeeshan Bin Iqbal Cela a-t-il résolu votre problème ?

47voto

GoogleMac Points 1102

Les autres réponses ne fonctionnent pas pour moi - elles sont peut-être dépassées. Voici la solution que j'ai utilisée pour définir automatiquement un attribut :

/**
 * The "booting" method of the model.
 *
 * @return void
 */
protected static function boot()
{
    parent::boot();

    // auto-sets values on creation
    static::creating(function ($query) {
        $query->is_voicemail = $query->is_voicemail ?? true;
    });
}

0 votes

C'est génial

1 votes

Je dois également préciser que j'essaie d'utiliser les valeurs par défaut dans les migrations. L'exemple ci-dessus provient d'un modèle Voicemail qui étend un modèle Recording, ils utilisent donc la même table. Lorsqu'un nouveau modèle Voicemail est créé, is_voicemail est défini sur true.

2 votes

J'avais juste besoin de définir une valeur si elle est nulle à la création, donc cela a bien fonctionné pour moi.

11voto

Alexey Mezenin Points 86781

Vous devez définir des valeurs par défaut dans migrations :

$table->tinyInteger('role')->default(1);

5 votes

Par exemple, lorsque vous utilisez des modèles pour la validation de formulaires, vous souhaitez disposer d'une valeur par défaut avant de l'enregistrer dans la base de données. En utilisant votre exemple, vous devez ajouter l'enregistrement à la base de données avant de pouvoir récupérer la valeur par défaut, ce qui est fastidieux.

0 votes

Sans oublier que un peu de les types de colonnes n'autorisent pas les valeurs par défaut (comme le texte)

2 votes

Beaucoup de débutants vont sur Google, trouvent cette question et upvotent la réponse de Manish (et downvotent la mienne), mais je continue à croire que la réponse de Manish est la plus efficace. meilleure pratique est de le faire dans la classe de migration quand c'est possible . De plus, je ne vois pas de cas où vous validez un formulaire et où vous devez créer une nouvelle ligne puis obtenir une valeur par défaut de la base de données comme Innovaat l'a décrit précédemment. Obtenir toute sorte de valeur par défaut pendant la validation d'un formulaire me semble réinventer la roue.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X