php - usar - manual de eloquent
¿Cómo establecer un valor de atributo predeterminado para un modelo de Laravel/Eloquent? (2)
Si intento declarar una propiedad, como esta:
public $quantity = 9;
... no funciona, porque no se considera un "atributo", sino simplemente una propiedad de la clase modelo. No solo esto, sino que también estoy bloqueando el acceso al atributo "cantidad" real y existente.
¿Que debería hacer entonces?
Esto es lo que estoy haciendo ahora:
protected $defaults = array(
''quantity'' => 9,
);
public function __construct(array $attributes = array())
{
$this->setRawAttributes($this->defaults, true);
parent::__construct($attributes);
}
Sugeriré esto como PR, así que no necesitamos declarar este constructor en cada Modelo, y podemos aplicarlo fácilmente simplemente declarando la matriz $defaults
en nuestros modelos ...
ACTUALIZAR :
Como señaló cmfolio, la RESPUESTA real es bastante simple :
¡Solo anule la propiedad $attributes
! Me gusta esto:
protected $attributes = array(
''quantity'' => 9,
);
El problema se debatió aquí: https://github.com/laravel/framework/issues/2265
Una actualización de esto ...
@ j-bruni envió una propuesta y Laravel 4.0.x ahora está apoyando el uso de lo siguiente:
protected $attributes = array(
''subject'' => ''A Post''
);
Que establecerá automáticamente su atributo subject
a A Post
cuando construya. No necesita usar el constructor personalizado que ha mencionado en su respuesta.
Sin embargo, si terminas usando el constructor como lo hizo (lo cual tuve que hacer para usar Carbon::now()
) ten cuidado de que $this->setRawAttributes()
anule cualquier cosa que hayas establecido usando los $attributes
array arriba. Por ejemplo:
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);
}
Vea el hilo de Github para más información: https://github.com/laravel/framework/issues/2265