55

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

public $quantity = 9;

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

じゃあどうすればいいの?

4

5 に答える 5

91

これにアップデート...

@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 スレッドを参照してください。

于 2013-12-16T21:33:17.203 に答える
56

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

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

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

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


更新

cmfolio で指摘されているように、実際の ANSWER は非常に単純です。

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

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

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

于 2013-09-11T17:57:11.563 に答える
7

これは非常に古いものですが、この問題が発生したばかりで、このサイトを使用して解決できました。

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

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

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

更新/免責事項

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

于 2018-10-23T15:34:29.423 に答える