Подтвердить что ты не робот

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

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

public $quantity = 9;

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

Что делать, тогда?

4b9b3361

Ответ 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