Model 翻譯是資料模型,意味著他要定義資料欄位的屬性,與 Migration 不同的是,Model 的定義是為了規範程式碼對資料庫的操作,Migration 則是直接定義資料庫。
寫法是將下列程式碼寫在 Class 裡就行了,以下介紹常用的定義:
預設值
在 Model 設定預設值有一個好處,萬一要更改的話,Migration 因為需要直接修改資料庫,如果資料不用保留還好,要保留資料的話還需要在寫一個 Migration 檔去寫程式修改掉原本的東西,還要下指令才會更新,但在 Model 設定的話只需要簡單的改掉幾個字。
protected $attributes = [
'name' => 'none',
];
資料表名稱
通常建立 Model 時,資料表名稱會是 Model 名的小寫複數,例如:Store 與 stores,但如果你不想依照這個規則的話就需要在這裡定義。
protected $table = 'my_stores';
時間戳記
$timestamps
為false
時,新增資料時就不會自動寫入時間戳記,$dateFormat
用來定義時間戳記格式,格式請參考這裡,最後CREATED_AT
與UPDATED_AT
是在 Migration 使用timestamps()
所建立的兩個欄位,可以在這裡定義欄位名稱。
public $timestamps = false;
protected $dateFormat = 'U';
const CREATED_AT = 'creationAt';
const UPDATED_AT = 'updatedAt';
批量分配
laravel 為了保護資料不會被批量填入,會把所有欄位保護起來,如果要能夠批量填入欄位資料,就需要設定$fillable
與$guarded
,何批量填入會在 ORM 解釋。
protected $fillable = ['name','address','description'];//定義可以批量填入的欄位
protected $guarded = ['id','create_at','update_at'];//定義不能批量填入的欄位
protected $guarded = [];//只有這行的話,代表全部開放修改
隱藏屬性
顧名思義就是把不想被 SELECT *
查出來的資訊藏起來
protected $hidden = ['password'];
關聯
最後是最重要的關聯,寫好這部分可以很大程度的減少查詢程式碼。關聯以函式方法定義,函式名通常就以要關連到的 Model 名,一樣寫在 Class 裡。
要注意的是,兩個 Model 都需要定義,定義完一個,另一個也要反向定義回來。
//一對一
//Store.php
public function product()
{
return $this->hasOne(Product::class, 'store_id', 'id');
}
//Product.php
public function store()
{
return $this->belongsTo(Store::class, 'store_id', 'id');
}
//一對多
//Store.php
public function product()
{
return $this->hasMany(Product::class, 'store_id', 'id');
}
//Product.php
public function store()
{
return $this->belongsTo(Store::class, 'store_id', 'id');
}
多對多的話,一定還會有一張關係表,也就會是兩次一對多。
//多對多
//Store.php
public function product()
{
return $this->hasMany(Product::class, 'store_id', 'id');
}
//Product.php
public function store()
{
return $this->belongsTo(Store::class, 'store_id', 'id');
}
關於定義完了之後,要如何查詢,就等到有資料之後再講。先接著用Seeder生成假資料吧。