Как установить значение атрибута по умолчанию для модели Laravel/Eloquent?
Если я попытаюсь объявить свойство, например:
public $quantity = 9;
...это не работает, потому что это не считается "атрибутом", а просто свойством класса модели. Не только это, но и я блокирую доступ к фактически реальному и существующему атрибуту "количество".
Что же мне тогда делать?
2 answers
Обновление к этому...
@j-бруни представил предложение, и Laravel 4.0.x теперь поддерживает его, используя следующее:
protected $attributes = array(
'subject' => 'A Post'
);
, который автоматически установит ваш атрибут subject
на A Post
при построении. Вам не нужно использовать пользовательский конструктор, который он упомянул в своем ответе.
Однако, если вы в конечном итоге используете конструктор, как у него (что мне нужно было сделать, чтобы использовать Carbon::now()
), будьте осторожны, чтобы $this->setRawAttributes()
переопределил все, что вы установили, используя $attributes
массив выше. Например:
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);
}
Смотрите поток Github для получения дополнительной информации: https://github.com/laravel/framework/issues/2265
Вот что я сейчас делаю:
protected $defaults = array(
'quantity' => 9,
);
public function __construct(array $attributes = array())
{
$this->setRawAttributes($this->defaults, true);
parent::__construct($attributes);
}
Я предложу это в качестве PR, поэтому нам не нужно объявлять этот конструктор в каждой модели, и мы можем легко применить его, просто объявив массив $defaults
в наших моделях...
ОБНОВЛЕНИЕ:
Как указывает cmfolio, фактический ОТВЕТ довольно прост:
Просто переопределите свойство $attributes
! Вот так:
protected $attributes = array(
'quantity' => 9,
);
Этот вопрос обсуждался здесь: https://github.com/laravel/framework/issues/2265