Как установить значение атрибута по умолчанию для модели Laravel/Eloquent?
Если я попробую объявить свойство, например:
public $quantity = 9;
... он не работает, потому что он не считается "атрибутом", а просто свойством класса модели. Не только это, но и я блокирую доступ к фактически реальному и существующему атрибуту "количество".
Что делать, тогда?
Ответы
Ответ 1
Это то, что я делаю сейчас:
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,
);
Вопрос обсуждался здесь.
Ответ 2
Обновление к этому...
@j-bruni отправил предложение, и теперь 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 для получения дополнительной информации.
Ответ 3
Я знаю, что это действительно старая версия, но у меня была эта проблема, и я смог решить ее с помощью этого сайта.
Добавьте этот код в вашу модель
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->user_id = auth()->id();
});
}
Обновление/Отказ от ответственности
Этот код работает, но он переопределяет обычное событие creating
модели Eloquent