Comment définir une valeur d'attribut par défaut pour un Laravel / Éloquent modèle?
si j'essaie de déclarer une propriété, comme ceci:
public $quantity = 9;
...il ne fonctionne pas, car il n'est pas considéré comme un "attribut", mais simplement une propriété de la classe du modèle. Non seulement cela, mais aussi je bloque l'accès à l'attribut "quantité" réel et existant.
Que dois-je faire, alors?
2 réponses
une mise à jour de ceci...
@j-bruni a soumis une proposition et Laravel 4.0.x supporte maintenant l'utilisation de ce qui suit:
protected $attributes = array(
'subject' => 'A Post'
);
qui définira automatiquement votre attribut subject
à A Post
lorsque vous construirez. Vous n'avez pas besoin d'utiliser le constructeur personnalisé, il a mentionné dans sa réponse.
cependant, si vous finissez par utiliser le constructeur comme il a (ce que j'ai dû faire afin d'utiliser Carbon::now()
) faites attention que $this->setRawAttributes()
annule tout ce que vous avez défini en utilisant le 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 Github pour plus d'informations: https://github.com/laravel/framework/issues/2265
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 vais suggérer ceci comme un PR donc nous n'avons pas besoin de déclarer ce constructeur à chaque modèle, et peut facilement s'appliquer en déclarant simplement le tableau $defaults
dans nos modèles...
mise à jour :
comme le souligne cmfolio, la réponse est assez simple :
la propriété $attributes
! Comme ceci:
protected $attributes = array(
'quantity' => 9,
);
la question a été traitée ici: https://github.com/laravel/framework/issues/2265