Skip to main content

Cast 是什麼

Eloquent 的 cast 是將從資料庫取得的原始值轉換為 PHP 資料型別,儲存時再進行反向轉換的機制。透過 casts 方法定義。

內建 Cast 種類

Laravel 標準提供的 cast 列表如下。
AsArrayObjectAsCollection 為了讓陣列的特定 offset 可以直接被修改,於 Laravel 內部作為自訂 cast 實作。

建立自訂 Cast 類別

若內建 cast 無法對應所需轉換,可建立實作 CastsAttributes 介面的自訂 cast。

介面的定義

框架本體的 contract 定義如下。
$attributes 引數含有模型的所有屬性,因此也能進行跨多欄位的轉換(後述 Value Object 模式)。

基本自訂 Cast 的實作

make:cast 指令產生範本。
會產生 app/Casts/AsMoney.php。以將金額(以整數儲存)轉換為 Money Value Object 的 cast 為例。
在模型上套用 cast。
如此 $order->price 便會回傳 Money 實例。

Value Object Cast

將多個 DB 欄位彙整為一個 Value Object 處理的模式。

實作範例:地址 Cast

address_line_oneaddress_line_two 兩個欄位彙整為 Address Value Object。
set 方法回傳陣列時,Eloquent 會將 key 視為欄位名,將值分別存入各欄位。單一欄位的 cast 則會回傳字串或整數。
模型的套用與使用方式如下。

Value Object 的快取

轉換為 Value Object 的屬性值會被 Eloquent 快取。即便對同一屬性存取兩次,也會回傳同一物件實例。 若想停用快取,可在 cast 類別上加入 $withoutObjectCaching 屬性。

Inbound Cast(僅寫入時)

僅於寫入 DB 時進行轉換,讀取時不轉換的 cast。實作 CastsInboundAttributes 介面。 典型用途為 hash 化。僅在儲存密碼或秘密值時進行轉換,讀取時直接回傳 hash 值。

Cast 參數

若要傳遞參數給自訂 cast,可在類別名稱後以冒號分隔指定。多個參數以逗號分隔。
參數會傳入 cast 類別的建構函式。

Castables:於 Value Object 端持有 cast 邏輯

實作 Castable 介面的 Value Object 擁有回傳自身 cast 類別的 castUsing 方法。模型端無需知道 cast 類別,網域邏輯得以整理。
模型端不再指定 cast 類別,改指定 Value Object 類別。
結合 Castable 與匿名類別,可將 Value Object 與 cast 邏輯彙整於單一檔案。

$appends$hidden 的交互作用

Cast 與 $appends$hidden 是各自獨立的機制,但組合時需注意。
$hidden 中指定的是 DB 的欄位名。應指定原始欄位名(address_line_one, address_line_two),而非透過 cast 產生的屬性名(address)。

執行時新增 Cast

若想僅為特定查詢或請求新增 cast,可使用 mergeCasts 方法。

下一步

Eloquent Observer 與模型事件

學習掛勾模型的儲存、刪除等生命週期事件以新增處理的方法。
最後修改於 2026年8月2日