web-dev-qa-db-ja.com

Laravel / Eloquentモデルのデフォルトの属性値を設定するには?

このようにプロパティを宣言しようとすると:

public $quantity = 9;

...これは機能しません。「属性」とは見なされず、単にモデルクラスのプロパティであるためです。これだけでなく、実際に存在する「数量」属性へのアクセスもブロックしています。

では、どうすればいいですか?

45
J. Bruni

これは私が今やっていることです:

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

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

これをPRとして提案するので、すべてのモデルでこのコンストラクタを宣言する必要はなく、モデルで$defaults配列を宣言するだけで簡単に適用できます...


[〜#〜] update [〜#〜]

Cmfolioが指すように、実際のANSWERは非常に単純です

$attributesプロパティをオーバーライドするだけです!このような:

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

この問題は こちら で議論されました。

51
J. Bruni

これの更新...

@ j-bruniは提案を提出し、Laravel 4.0.xは現在、次の使用をサポートしています:

protected $attributes = array(
  'subject' => 'A Post'
);

これにより、構築時に属性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);
}

詳細については、 Githubスレッド を参照してください。

77
cmfolio

私はこれが本当に古いことを知っていますが、この問題が発生したばかりで、 このサイト を使用してこれを解決することができました。

このコードをモデルに追加します

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

   static::creating(function ($model) {
        $model->user_id = auth()->id();
    });
}

更新/免責事項

このコードは機能しますが、通常のEloquent Model creatingイベントをオーバーライドします

0
pbgneff