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?

40
demandé sur J. Bruni 2013-09-11 21:22:11

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

67
répondu cmfolio 2013-12-16 21:33:17

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

48
répondu J. Bruni 2014-01-21 16:34:18