Как установить значение атрибута по умолчанию для модели Laravel/Eloquent?


Если я попытаюсь объявить свойство, например:

public $quantity = 9;

...это не работает, потому что это не считается "атрибутом", а просто свойством класса модели. Не только это, но и я блокирую доступ к фактически реальному и существующему атрибуту "количество".

Что же мне тогда делать?

Author: J. Bruni, 2013-09-11

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

 67
Author: cmfolio, 2013-12-16 21:33:17

Вот что я сейчас делаю:

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

 48
Author: J. Bruni, 2014-01-21 16:34:18