iT邦幫忙

第 12 屆 iThome 鐵人賽

DAY 10
1
Software Development

30天開發與部署 Laravel 專案系列 第 10

Eloquent ORM 前置作業:設定Model

物件關聯對映(Object Relational Mapping,簡稱ORM),用於實現導向程式語言裡不同類型系統資料間的轉換轉換,換句話說可理解為將資料庫的轉為物件,並可透過物件實現CRUD。

Eloquent ORM 即為 Laravel 為了達成 ORM所建構架構,但需先夠透過設定 Model與其Attribute來逐一實現。
因此這篇會主要提到model可以設定哪些東西,有哪些影響。

建立指令

基本寫法
php artisan make:model 資料表名稱

如果想同時產生對應的資料表
php artisan make:model Record --migration
php artisan make:model Record -m

執行上面指令後,檔案會產生在 app 資料夾路徑底下。
個人常用的Model功能如下

確認 table

protected $table = 'users';

確定這個model對應到哪張資料表

fillable & hidden

/**
 * The attributes that are mass assignable.
 *
 * @var array
 */
protected $fillable = [
    'name', 'email', 'password',
];

/**
 * The attributes that should be hidden for arrays.
 *
 * @var array
 */
protected $hidden = [
    'password', 'remember_token',
];

fillable
可以設定批量赋值 ( 一次提供多個數值並以模型的 create() 方法建立一筆新數值 ) 的欄位
https://laravel.tw/docs/5.0/eloquent#mass-assignment
定義模型 Guarded 屬性
guarded 與 fillable 相反,是作為「黑名單」而不是「白名單」:

hidden
可以避免使用 Eloquent ORM 時不小心回傳重要資訊,e.g. password ,或多餘的訊息。

Eloquent: Mutators

修改器,格式化調整 Eloquent 屬性。
https://laravel.com/docs/7.x/eloquent-mutators

set: 設定屬性後寫入DB

官方文件有提到 Accessors and mutators 允許調整實例屬性
這部分示範將 password 在request傳入時為明碼後,寫入資料庫前進行加密的方式

public function setPasswordAttribute($password)
{
    if ($password !== null & $password !== "") {
        $this->attributes['password'] = Hash::make($password);
    }
}

為什麼要加密

  1. 減少使用者密碼明碼盜用問題
  2. 原生 Auth::attempt 等套件需以加密後密碼進行比對

get: 調整屬性取用後的格式

自定義時間戳格式

如果想要自定義時間戳格式,可以在模型類別裡覆寫 getDateFormat 方法:

https://laravel.tw/docs/5.0/eloquent#timestamps

cast

型別轉換,類似get的功用,可以大量設定多筆欄位。

例如調整資料庫中的timestamp相關欄位,不要顯示到毫秒以下的數值。

  protected $casts = [
        'created_at'  => 'date:Y-m-d H:i:s',
        'updated_at'  => 'date:Y-m-d H:i:s',
        'deleted_at'  => 'date:Y-m-d H:i:s',
    ];

Eloquent: Relationships

常用的 one to one , one to many也是先在model裡設定,以 one to many 為例 :

**user model **

    public function currentBio()
    {
        return $this->hasMany('App\bioProfile','user_id')
            ->orderBy('updated_at','desc')
            ->first()
            ;
    }
  • one to many 的 one
  • 一個user有很多筆bioProfile

bioProfile model

   public function user()
   {
        return $this->belongsTo('App\User', 'user_id');
   } 
  • one to many 的 many

Soft delete

數據是珍貴的,Eloquent提供軟刪除模式,讓Laravel執行刪除時不會真的把資料移除資料庫。

除了在migration table端要加入 $table->softDeletes() 之外;

Model 需添加的以下code

use Illuminate\Database\Eloquent\SoftDeletes;

class User extends Model
{
    use SoftDeletes;
}

migrate up後,資料表會多一個「deleted_at」欄位,用來紀錄刪除時間

並且日後進行任何搜尋時會找不到這筆被softdelete的資料。


參考資料
https://zh.wikipedia.org/wiki/%E5%AF%B9%E8%B1%A1%E5%85%B3%E7%B3%BB%E6%98%A0%E5%B0%84
https://www.w3adda.com/laravel-tutorial/laravel-eloquent-orm
https://medium.com/@vicxu/%E8%B3%87%E6%96%99%E5%BA%AB%E8%88%87object-relational-mapping-316cc5aaae7d
https://ithelp.ithome.com.tw/articles/10219283


上一篇
Laravel Migrations
下一篇
Eloquent ORM 實作(1):以註冊為例
系列文
30天開發與部署 Laravel 專案30

尚未有邦友留言

立即登入留言