Если я попробую объявить свойство, вот так:
public $quantity = 9;
… он не работает, потому что он не считается «атрибутом», а просто свойством класса модели. Не только это, но и я блокирую доступ к фактически реальному и существующему атрибуту «количество».
Что делать, тогда?
Обновление для этого …
@ 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 для получения дополнительной информации: 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
в наших моделях …
ОБНОВЛЕНИЕ :
Как указано в сопоставлении, фактический ОТВЕТ достаточно прост :
Просто переопределите свойство $attributes
! Как это:
protected $attributes = array( 'quantity' => 9, );
Вопрос был рассмотрен здесь: https://github.com/laravel/framework/issues/2265