物件關聯對映(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功能如下
protected $table = 'users';
確定這個model對應到哪張資料表
/**
* 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 屬性。
https://laravel.com/docs/7.x/eloquent-mutators
官方文件有提到 Accessors and mutators 允許調整實例屬性
這部分示範將 password 在request傳入時為明碼後,寫入資料庫前進行加密的方式
public function setPasswordAttribute($password)
{
if ($password !== null & $password !== "") {
$this->attributes['password'] = Hash::make($password);
}
}
為什麼要加密
自定義時間戳格式
如果想要自定義時間戳格式,可以在模型類別裡覆寫 getDateFormat 方法:
https://laravel.tw/docs/5.0/eloquent#timestamps
型別轉換,類似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',
];
常用的 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()
;
}
bioProfile model
public function user()
{
return $this->belongsTo('App\User', 'user_id');
}
數據是珍貴的,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