使用中繼模型繼承(extends)Eloquent 模型造成無法使用大量資料新增(Mess Assignment)
大部份的情況可能專案較小,所以我們會直接使用模型(Model)去新增資料,但若專案較大時,且不同的模型之間有共用的方法的話,我會會希望這些模型繼承同一個 Eloquent 模型的中繼類別物件,就像這樣:
Eloquent 模型的中繼類別物件
class CustomBaseModel extends Model
{
public $someVariable = null;
public function doSomething()
{
}
}
使用者模型繼承「Eloquent 模型的中繼類別物件」
class User extends CustomBaseModel {
protected $fillable = ['first_name', 'last_name', 'email'];
}
使用這樣的中繼類別時,如果我們只有設定變數
或實作中繼模型類別方法
時,我們可以運作的很正常,但是如果我們需要實作中繼類別的建構子__construct()
時,我們必須要時做原本 Eloquent Model 類別的建構子,否鑿會無法正常的運作原有的 Eloquent 模型
在 vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
Eloquent 模型的檔案中,我們可以看到建構子__construct()
有需要傳入資料表欄位的屬性值 $attributes
。
// vendor/laravel/framework/src/Illuminate/Database/Eloquent/Model.php
abstract class Model implements ArrayAccess, Arrayable, Jsonable, JsonSerializable, QueueableEntity, UrlRoutable {
public function __construct(array $attributes = array())
{
$this->bootIfNotBooted();
$this->syncOriginal();
$this->fill($attributes);
}
}
這個部分是用來做大量資料新增或異動時(Mass Assignment)需要用到的資料,所以如果我們在中繼類別沒有實作這個建構子__construct()
,會讓我們的完整 Eloquent Model 出現問題
所以在 Eloquent 中繼類別中我們必須要時作的建構子__construct()
會長的像這樣:
class CustomBaseModel extends Model
{
public $someVariable = null;
function __construct(array $attributes = array())
{
parent::__construct($attributes);
// 做中繼類別建構子想要做的事
$this->someVariable = '5566';
}
}
我們的中繼類別,需要傳入資料表欄位的屬性值 $attributes
,並執行母類別 Eloquent Model 的建構子,這樣我們的 Eloquent 模型就能夠正常運作了!
KeJyun 最新新書推薦
|
|
---|---|
Laravel 是 PHP 的框架(Framework),提供了很多開發網站或 API 所需的工具及環境,經過簡單的設定就可以完成資料的處理及顯示,使開發者可以很優雅且快速的開發出各個不同的產品。本書適合有 PHP 基礎的人,但不知道要怎麼選擇框架,或者不用框架的人也能夠明白它的好處。 雖然 WordPress 也能夠架站,但如果有客製化需求,要開發各式各樣的網站,或提供 App 使用的 API,如此一來你只能選擇用框架,而 Laravel 是目前最受歡迎的。 本書將解說為什麼要使用框架,以及理解框架的優缺點後,要怎麼選擇框架,並用框架快速建構一個網站。除非必要,否則書中會避免專業技術用語,盡量使用最生活化易懂的例子及語氣,讓大家更容易進入 Laravel 的世界。 |
|
購書連結 |
|
購書連結 |