因此,我有一個Page
模型,它擴展了Eloquent
Model
類。我想重寫構造函數,我需要一些額外的邏輯。這是我目前有:Laravel雄辯 - 覆蓋模型的構造函數來更改屬性
class Page extends Model
{
public function __construct(array $attributes = [])
{
parent::__construct($attributes);
$this->main_image = null;
}
}
但這似乎並沒有給main_image
保存到$this->attributes
財產當我打電話Page::find(1);
。
我相信這是因爲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
和類似的方法,但這看起來很不方便,不可維護。
謝謝!
所以,基本上你想要重寫一個參數,每當你創建一個新的元素?您應該使用模型事件https://laravel.com/docs/5.4/eloquent#events - 特別是查看「創建/創建」。 – Gacek
覆蓋只是一個例子,可能有多個參數覆蓋,他們會被包裹在if語句等。我會檢查出事件,如果我可以將它們應用於所有類而無需爲每個模型編寫Observer類得到。謝謝! – Giedrius
你的模型還沒有'main_image'字段嗎?在模型中設置它的最終目標是什麼?如果所有頁面都有一個'main_image',可能會有另外一種解決這個問題的方法,可能會形成一個關係,以便你可以執行'$ page-> mainImage-> get()' – Mikey