如何为Laravel/Eloquent模型设置默认属性值?

J. *_*uni 46 php model laravel eloquent laravel-4

如果我尝试声明属性,像这样:

public $quantity = 9;
Run Code Online (Sandbox Code Playgroud)

...它不起作用,因为它不被视为"属性",而仅仅是模型类的属性.不仅如此,我还阻止访问实际存在的"数量"属性.

那我该怎么办?

cmf*_*lio 79

对此的更新......

@ j-bruni提交了一份提案,Laravel 4.0.x现在支持使用以下内容:

protected $attributes = array(
  'subject' => 'A Post'
);
Run Code Online (Sandbox Code Playgroud)

这将在您构造时自动将属性设置subjectA 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);
}
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅Github线程.

  • @PetarVasilev您可以使用上面的`__construct`覆盖方式,并在分配时调用一个生成随机值的函数。 (2认同)

J. *_*uni 52

这就是我现在正在做的事情:

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

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

我会建议将其作为PR,这样我们就不需要在每个模型中声明这个构造函数,只需$defaults在模型中声明数组即可轻松应用...


更新:

正如cmfolio所指出的,实际的ANSWER非常简单:

只是覆盖$attributes财产!像这样:

protected $attributes = array(
   'quantity' => 9,
);
Run Code Online (Sandbox Code Playgroud)

这里讨论了这个问题.


pbg*_*eff 8

我知道这确实很旧,但我刚刚遇到了这个问题,并且能够使用此网站解决此问题。

将此代码添加到您的模型中

protected static function boot()
{
   parent::boot();

   static::creating(function ($model) {
        $model->user_id = auth()->id();
    });
}
Run Code Online (Sandbox Code Playgroud)

更新/免责声明

此代码有效,但它将覆盖常规 Eloquent 模型creating事件