Page
モデルはEloquent
Model
クラスに拡張されています。私はいくつかの追加ロジックが必要なコンストラクタをオーバーライドしようとしています。これは私が現在持っているものです。Laravel Eloquent - モデルのコンストラクタをオーバーライドして属性を変更します
class Page extends Model
{
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->main_image = null;
}
}
しかし、これは私がPage::find(1);
を呼び出すとき$this->attributes
プロパティにmain_image
を保存していないようです。
私はPage::find
は最終的にこのようになりますこれは、Model::newFromBuilder
を呼び出すためであると信じて:あなたは何かがコンストラクタで設定されていることを意味し、それは最初のインスタンスを作成し、属性を設定します見ることができるように
public function newFromBuilder($attributes = [], $connection = null)
{
$model = $this->newInstance([], true);
$model->setRawAttributes((array) $attributes, true);
$model->setConnection($connection ?: $this->getConnectionName());
return $model;
}
無視されます。
すべての取得/作成されたモデルインスタンスの属性を変更するために、コンストラクタ(または同様のメソッド)をオーバーライドするための回避策はありますか?明らかに私はnewFromBuilder
、newInstance
、__construct
などの方法を無効にすることができますが、これは非常にハッキリで維持不能なようです。
ありがとうございます!
基本的に、新しい要素を作成するたびに1つのパラメータを上書きしたいのですか?そのためのモデルイベント、https://laravel.com/docs/5.4/eloquent#eventsを使用してください。特に、「作成/作成」を参照してください。 – Gacek
オーバーライドは単なる例であり、複数のパラメータがオーバーライドされていて、if文などでラップされている可能性があります。それぞれのモデルに対してObserverクラスを作成せずにすべてのクラスに適用できる場合は、得た。ありがとう! – Giedrius
あなたのモデルに 'main_image'フィールドがない理由はありますか?モデルの内部に設定する最終目標は何ですか?潜在的に、より多くの情報を潜在的に持つ問題への別のアプローチがあるかもしれません。すべてのページが 'main_image'を持っていれば、' $ page-> mainImage-> get() 'を実行できるようになります。 – Mikey