web-dev-qa-db-fra.com

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

Si j'essaie de déclarer une propriété, comme ceci:

public $quantity = 9;

... cela ne fonctionne pas, car il n'est pas considéré comme un "attribut", mais simplement une propriété de la classe de modèle. Non seulement cela, mais je bloque également l'accès à l'attribut "quantité" réellement réel et existant.

Que dois-je faire alors?

42
J. Bruni

C'est ce que je fais maintenant:

protected $defaults = array(
   'quantity' => 9,
);

public function __construct(array $attributes = array())
{
    $this->setRawAttributes($this->defaults, true);
    parent::__construct($attributes);
}

Je suggérerai ceci en tant que PR afin que nous n'ayons pas besoin de déclarer ce constructeur à chaque modèle et que nous puissions facilement l'appliquer en déclarant simplement le tableau $defaults dans nos modèles ...


METTRE À JOUR:

Comme indiqué par cmfolio, la REPONSE actuelle est assez simple

Remplacez simplement la propriété $attributes! Comme ça:

protected $attributes = array(
   'quantity' => 9,
);

La question a été discutée ici .

49
J. Bruni

Une mise à jour de cette ...

@ j-bruni a soumis une proposition et Laravel 4.0.x prend désormais en charge les éléments suivants:

protected $attributes = array(
  'subject' => 'A Post'
);

Ce qui définira automatiquement votre attribut subject à A Post lors de la construction. Vous n'avez pas besoin d'utiliser le constructeur personnalisé qu'il a mentionné dans sa réponse.

Cependant, si vous finissez par utiliser le constructeur comme il l'a fait (ce que je devais faire pour utiliser Carbon::now()), veillez à ce que $this->setRawAttributes() écrase tout ce que vous avez défini à l'aide du tableau $attributes ci-dessus. Par exemple:

protected $attributes = array(
  'subject' => 'A Post'
);

public function __construct(array $attributes = array())
{
    $this->setRawAttributes(array(
      'end_date' => Carbon::now()->addDays(10)
    ), true);
    parent::__construct($attributes);
}

// Values after calling `new ModelName`

$model->subject; // null
$model->end_date; // Carbon date object

// To fix, be sure to `array_merge` previous values
public function __construct(array $attributes = array())
{
    $this->setRawAttributes(array_merge($this->attributes, array(
      'end_date' => Carbon::now()->addDays(10)
    )), true);
    parent::__construct($attributes);
}

Voir le fil de discussion Github pour plus d'informations.

73
cmfolio

Je sais que c'est vraiment vieux, mais je viens d'avoir ce problème et j'ai pu le résoudre en utilisant ce site .

Ajouter ce code à votre modèle

protected static function boot()
{
   parent::boot();

   static::creating(function ($model) {
        $model->user_id = auth()->id();
    });
}

Mise à jour/Déni de responsabilité

Ce code fonctionne, mais il remplacera l'événement Eloquent Model creating classique.

0
pbgneff