はじめに
アクセサ・ミューテタ・属性キャストは、Eloquentモデルの属性値をモデルインスタンスで取得・設定するときに変換する仕組みです。- アクセサ — DBから取得した生の値を加工してアプリケーションに渡す
- ミューテタ — アプリケーションからセットされた値を加工してDBに保存する
- キャスト — 追加メソッドなしで属性の型変換を宣言的に定義する
アクセサの定義
アクセサを定義するには、モデルにprotected メソッドを追加します。メソッド名はキャメルケース、戻り値型は Illuminate\Database\Eloquent\Casts\Attribute にします。
get クロージャにDBの生の値が渡されます。モデルインスタンスから first_name プロパティとしてアクセスできます。
アクセサで計算した値をJSON/配列に含めたい場合は、モデルの
$appends プロパティにスネークケースで追加してください。複数の属性から値オブジェクトを生成する
get クロージャは第2引数として $attributes(モデルのすべての属性)を受け取れます。複数カラムを組み合わせて1つの値オブジェクトを返すことができます。
アクセサのキャッシュ
値オブジェクトを返すアクセサは、Eloquentが同じインスタンスを返すよう自動でキャッシュします。文字列や数値など基本型でもキャッシュしたい場合はshouldCache() を呼び出します。
withoutObjectCaching() を使います。
ミューテタの定義
ミューテタはAttribute::make() の set 引数として定義します。アクセサと同じメソッドにまとめられます。
set クロージャが呼ばれます。
複数の属性に書き込む
set クロージャから配列を返すと、複数のカラムをまとめて更新できます。
属性キャスト
キャストは、アクセサ・ミューテタを書かなくても属性の型変換を宣言できる簡便な方法です。モデルのcasts() メソッドで配列を返します。
組み込みキャスト一覧
Stringable キャスト
AsStringable を使うと、属性を Illuminate\Support\Stringable オブジェクトとして扱えます。
配列・JSON キャスト
JSON/TEXT カラムを PHP 配列として透過的に扱えます。-> 演算子で JSON の特定キーだけを更新することもできます。
AsArrayObject / AsCollection キャスト
標準のarray キャストは、配列の特定オフセットを直接変更しようとするとエラーになります。AsArrayObject や AsCollection を使うとこの問題を回避できます。
using() を指定します。
日時キャスト
created_at / updated_at はデフォルトで Carbon にキャストされます。追加の日時カラムも同様に定義できます。
serializeDate() をオーバーライドします(DB保存フォーマットには影響しません)。
Enum キャスト
PHP 8.1 以降の Backed Enum をキャストとして指定できます。string または int)が保存され、取得時には Enum インスタンスに変換されます。
Enum の配列キャスト
複数の Enum 値を1カラムに配列として保存したい場合はAsEnumCollection を使います。
クエリ時のキャスト
クエリ実行時に動的にキャストを適用するにはwithCasts() を使います。
カスタムキャスト
独自のキャストクラスを作成することも可能です。CastsAttributes インターフェースを実装し、get と set メソッドを定義します。
カスタムキャスト詳解
CastsAttributes インターフェースの実装方法や、Value Object パターン・Castables など上級のカスタムキャストを解説します。
関連ページ
Eloquent APIリソース
モデルを一貫したJSON APIレスポンスに変換するリソースクラスの使い方を確認します。