Skip to main content

簡介

存取器(Accessor)、**修改器(Mutator)屬性轉換(Cast)**是 Eloquent 模型在模型實例中取得、設定屬性值時進行轉換的機制。
  • 存取器:加工從資料庫取得的原始值後傳給應用程式
  • 修改器:加工由應用程式設定的值後儲存至資料庫
  • 轉換:不必額外撰寫方法,即可宣告式地定義屬性型別的轉換

定義存取器

要定義存取器,請在模型中加入 protected 方法。方法名稱使用駝峰式命名,回傳型別為 Illuminate\Database\Eloquent\Casts\Attribute
DB 的原始值會傳入 get 閉包中。你可以從模型實例以 first_name 屬性存取。
若想讓存取器算出的值也出現在 JSON / 陣列中,請將對應的 snake_case 名稱加入模型的 $appends 屬性。

由多個屬性生成值物件

get 閉包的第 2 個參數是 $attributes(模型的所有屬性)。可以將多個欄位組合,回傳單一值物件。

存取器的快取

回傳值物件的存取器,Eloquent 會自動快取以回傳同一個實例。若字串或數值等基本型也想要快取,可呼叫 shouldCache()
若要停用物件快取,可使用 withoutObjectCaching()

定義修改器

修改器透過 Attribute::make()set 參數定義。可以與存取器整合在同一個方法中。
當你為模型指派值時,set 閉包會被呼叫。

一次寫入多個屬性

set 閉包回傳陣列,可一次更新多個欄位。

屬性轉換

**轉換(Cast)**是一種不必撰寫存取器 / 修改器,即可宣告屬性型別轉換的簡便方式。透過模型的 casts() 方法回傳陣列。

內建轉換一覽

null 屬性不會被轉換。此外,請勿定義與關聯名稱相同的轉換,或對主鍵進行轉換。

Stringable 轉換

使用 AsStringable 可將屬性視為 Illuminate\Support\Stringable 物件。

陣列 / JSON 轉換

JSON / TEXT 欄位可以透明地視為 PHP 陣列處理。
也可以用 -> 運算子只更新 JSON 中特定的 key。

AsArrayObject / AsCollection 轉換

標準的 array 轉換若嘗試直接修改陣列特定位置會出錯。可使用 AsArrayObjectAsCollection 避開此問題。
若要使用自訂集合類別,可透過 using() 指定。

日期時間轉換

created_at / updated_at 預設會轉為 Carbon。其他日期時間欄位也可用相同方式定義。
指定格式後,JSON 序列化時將採用該格式。
若想更改所有日期預設的序列化格式,可覆寫 serializeDate()(不會影響 DB 儲存格式)。
immutable_datetime 會回傳 CarbonImmutable 而非 Carbon。因為不修改原有實例,能寫出無副作用的程式。

Enum 轉換

PHP 8.1 之後的 Backed Enum 可作為轉換目標指定。
DB 儲存的是 Enum 的 backing 值(stringint),取得時會轉為 Enum 實例。

Enum 的陣列轉換

若要把多個 Enum 值以陣列形式存到單一欄位,可使用 AsEnumCollection

查詢時的轉換

若要在查詢時動態套用轉換,可使用 withCasts()

自訂轉換

你也可以建立自訂的轉換類別。實作 CastsAttributes 介面並定義 getset 方法即可。
詳細的實作方法(Value Object 模式、Inbound Cast、Castables 等)請參閱下方進階頁面。

自訂轉換詳解

說明 CastsAttributes 介面的實作方式,以及 Value Object 模式、Castables 等進階自訂轉換。

相關頁面

Eloquent API 資源

瞭解將模型轉為一致 JSON API 回應的資源類別的用法。
最後修改於 2026年8月2日