このようにプロパティを宣言しようとすると:
public $quantity = 9;
...これは機能しません。「属性」とは見なされず、単にモデルクラスのプロパティであるためです。これだけでなく、実際に存在する「数量」属性へのアクセスもブロックしています。
では、どうすればいいですか?
これは私が今やっていることです:
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,
);
この問題は こちら で議論されました。
これの更新...
@ 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スレッド を参照してください。
私はこれが本当に古いことを知っていますが、この問題が発生したばかりで、 このサイト を使用してこれを解決することができました。
このコードをモデルに追加します
protected static function boot()
{
parent::boot();
static::creating(function ($model) {
$model->user_id = auth()->id();
});
}
更新/免責事項
このコードは機能しますが、通常のEloquent Model creating
イベントをオーバーライドします