2013-09-11 7 views
37

Если я пытаюсь объявить свойство, как это:Как установить значение атрибута по умолчанию для модели Laravel/Eloquent?

public $quantity = 9; 

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

Что делать?

ответ

44

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

protected $defaults = array(
    'quantity' => 9, 
); 

public function __construct(array $attributes = array()) 
{ 
    $this->setRawAttributes($this->defaults, true); 
    parent::__construct($attributes); 
} 

Я предлагаю это как PR, поэтому мы не должны объявить этот конструктор в каждой модели, и можно легко применить просто объявить $defaults массив в наших моделях ...


UPDATE:

Как указано на cmfolio, фактический ОТВЕТ достаточно прост:

Просто переоценить $attributes! Как это:

protected $attributes = array(
    'quantity' => 9, 
); 

Выпуск dicussed здесь: https://github.com/laravel/framework/issues/2265

+0

J.Bruni, ум обмена PR URL? поэтому мы можем отслеживать это также :) –

+0

@TianLoon, я обновил ответ. Оригинальный PR находится здесь: https://github.com/laravel/framework/pull/2264 - я сам его закрыл, узнав больше о '$ attributes' и признав, что это не обязательно. См. Ответ @cmfolio для получения подробной информации (он использует мое предлагаемое решение, потому что ему нужно создать экземпляр объекта для одного значения по умолчанию). –

+0

@ J.Bruni привет, я попробовал переопределить атрибуты $, такие как ваш ответ. , когда 'dd()' значение атрибутов по умолчанию отображается правильно. , но атрибут mutators не работает для этого способа. :/ Я делаю это в laravel 5 – antoniputra

61

Обновление этого ...

@ 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

+1

Спасибо, это помогло много – jhamPac

+0

Вы знаете, как сделать значение случайным образом сгенерированным, а не быть одинаковым при каждом создании экземпляров моделей?(это может стоить отдельного вопроса, но я подумал сначала прокомментировать) –

+1

@PetarVasilev Вы можете использовать вышеперечисленное '__construct' и вызвать функцию, которая генерирует ваше случайное значение при назначении. – cmfolio

Смежные вопросы