Model 翻譯是資料模型,意味著他要定義資料欄位的屬性,與 Migration 不同的是,Model 的定義是為了規範程式碼對資料庫的操作,Migration 則是直接定義資料庫。

寫法是將下列程式碼寫在 Class 裡就行了,以下介紹常用的定義:

  1. 預設值

    在 Model 設定預設值有一個好處,萬一要更改的話,Migration 因為需要直接修改資料庫,如果資料不用保留還好,要保留資料的話還需要在寫一個 Migration 檔去寫程式修改掉原本的東西,還要下指令才會更新,但在 Model 設定的話只需要簡單的改掉幾個字。

    protected $attributes = [
    		'name' => 'none',
    ];
    
  2. 資料表名稱

    通常建立 Model 時,資料表名稱會是 Model 名的小寫複數,例如:Store 與 stores,但如果你不想依照這個規則的話就需要在這裡定義。

    protected $table = 'my_stores';
    
  3. 時間戳記

    $timestampsfalse時,新增資料時就不會自動寫入時間戳記,$dateFormat 用來定義時間戳記格式,格式請參考這裡,最後CREATED_ATUPDATED_AT是在 Migration 使用timestamps()所建立的兩個欄位,可以在這裡定義欄位名稱。

    public $timestamps = false;
    
    protected $dateFormat = 'U';
    
    const CREATED_AT = 'creationAt';
    const UPDATED_AT = 'updatedAt';
    
  4. 批量分配

    laravel 為了保護資料不會被批量填入,會把所有欄位保護起來,如果要能夠批量填入欄位資料,就需要設定$fillable$guarded ,何批量填入會在 ORM 解釋。

    protected $fillable = ['name','address','description'];//定義可以批量填入的欄位
    protected $guarded = ['id','create_at','update_at'];//定義不能批量填入的欄位
    
    protected $guarded = [];//只有這行的話,代表全部開放修改
    
  5. 隱藏屬性

    顧名思義就是把不想被 SELECT * 查出來的資訊藏起來

    protected $hidden = ['password'];
    
  6. 關聯

    最後是最重要的關聯,寫好這部分可以很大程度的減少查詢程式碼。關聯以函式方法定義,函式名通常就以要關連到的 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生成假資料吧。