簡介
存取器(Accessor)、**修改器(Mutator)與屬性轉換(Cast)**是 Eloquent 模型在模型實例中取得、設定屬性值時進行轉換的機制。- 存取器:加工從資料庫取得的原始值後傳給應用程式
- 修改器:加工由應用程式設定的值後儲存至資料庫
- 轉換:不必額外撰寫方法,即可宣告式地定義屬性型別的轉換
定義存取器
要定義存取器,請在模型中加入protected 方法。方法名稱使用駝峰式命名,回傳型別為 Illuminate\Database\Eloquent\Casts\Attribute。
get 閉包中。你可以從模型實例以 first_name 屬性存取。
若想讓存取器算出的值也出現在 JSON / 陣列中,請將對應的 snake_case 名稱加入模型的
$appends 屬性。由多個屬性生成值物件
get 閉包的第 2 個參數是 $attributes(模型的所有屬性)。可以將多個欄位組合,回傳單一值物件。
存取器的快取
回傳值物件的存取器,Eloquent 會自動快取以回傳同一個實例。若字串或數值等基本型也想要快取,可呼叫shouldCache()。
withoutObjectCaching()。
定義修改器
修改器透過Attribute::make() 的 set 參數定義。可以與存取器整合在同一個方法中。
set 閉包會被呼叫。
一次寫入多個屬性
從set 閉包回傳陣列,可一次更新多個欄位。
屬性轉換
**轉換(Cast)**是一種不必撰寫存取器 / 修改器,即可宣告屬性型別轉換的簡便方式。透過模型的casts() 方法回傳陣列。
內建轉換一覽
Stringable 轉換
使用AsStringable 可將屬性視為 Illuminate\Support\Stringable 物件。
陣列 / JSON 轉換
JSON / TEXT 欄位可以透明地視為 PHP 陣列處理。-> 運算子只更新 JSON 中特定的 key。
AsArrayObject / AsCollection 轉換
標準的array 轉換若嘗試直接修改陣列特定位置會出錯。可使用 AsArrayObject 或 AsCollection 避開此問題。
using() 指定。
日期時間轉換
created_at / updated_at 預設會轉為 Carbon。其他日期時間欄位也可用相同方式定義。
serializeDate()(不會影響 DB 儲存格式)。
Enum 轉換
PHP 8.1 之後的 Backed Enum 可作為轉換目標指定。string 或 int),取得時會轉為 Enum 實例。
Enum 的陣列轉換
若要把多個 Enum 值以陣列形式存到單一欄位,可使用AsEnumCollection。
查詢時的轉換
若要在查詢時動態套用轉換,可使用withCasts()。
自訂轉換
你也可以建立自訂的轉換類別。實作CastsAttributes 介面並定義 get 與 set 方法即可。
自訂轉換詳解
說明 CastsAttributes 介面的實作方式,以及 Value Object 模式、Castables 等進階自訂轉換。
相關頁面
Eloquent API 資源
瞭解將模型轉為一致 JSON API 回應的資源類別的用法。