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 轉換若嘗試直接修改陣列特定位置會出錯。可使用 AsArrayObject 或 AsCollection 避開此問題。
若要使用自訂集合類別,可透過 using() 指定。

向量轉換

使用 Illuminate\Database\Eloquent\Casts\AsVector 轉換類別,可在資料庫的向量欄位與 PHP 陣列之間相互轉換。
設定屬性時,可傳入 PHP 陣列或 Laravel collection 等 Arrayable 實例。取得屬性時,轉換會回傳浮點數陣列。

日期時間轉換

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

Enum 轉換

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

Enum 的陣列轉換

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

查詢時的轉換

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

自訂轉換

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

自訂轉換詳解

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

相關頁面

Eloquent API 資源

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