キャストとは
Eloquentのキャストは、データベースから取得した生の値をPHPのデータ型に変換し、保存時にはその逆変換をする仕組みです。casts メソッドで定義します。
組み込みキャストの種類
Laravelが標準で提供するキャスト一覧です。AsArrayObject や AsCollection は、配列の特定のオフセットを直接変更できるように、Laravel内部でカスタムキャストとして実装されています。カスタムキャストクラスの作成
組み込みキャストでは対応できない変換が必要な場合、CastsAttributes インターフェースを実装したカスタムキャストを作成します。
インターフェースの定義
フレームワーク本体のコントラクトは次のように定義されています。$attributes 引数にはモデルの全属性が入っているため、複数のカラムをまたいだ変換も可能です(後述のValue Objectパターン参照)。
基本的なカスタムキャストの実装
make:cast コマンドで雛形を生成します。
app/Casts/AsMoney.php が生成されます。例として金額(整数で保存)を Money Value Objectに変換するキャストを実装します。
$order->price は Money インスタンスを返します。
Value Objectキャスト
複数のDBカラムをまとめて1つのValue Objectとして扱うパターンです。実装例: 住所キャスト
address_line_one と address_line_two の2カラムを Address Value Objectにまとめます。
set メソッドで配列を返すと、Eloquentはキーをカラム名として、値をそれぞれのカラムに保存します。単一カラムのキャストでは文字列や整数を返します。Value Objectのキャッシュ
Value Objectに変換された属性値はEloquentによってキャッシュされます。同じ属性に2回アクセスしても、同じオブジェクトインスタンスが返ります。 キャッシュを無効化したい場合は$withoutObjectCaching プロパティをキャストクラスに追加します。
インバウンドキャスト(書き込み専用)
DBへの書き込み時にのみ変換を行い、読み取り時には変換しないキャストです。CastsInboundAttributes インターフェースを実装します。
典型的な用途はハッシュ化です。パスワードや秘密値を保存するときだけ変換し、読み取り時はハッシュ値をそのまま返します。
キャストパラメータ
カスタムキャストにパラメータを渡す場合は、クラス名の後にコロン区切りで指定します。複数のパラメータはカンマ区切りです。Castables: Value Object側にキャストロジックを持たせる
Castable インターフェースを実装した Value Object は、自身のキャストクラスを返す castUsing メソッドを持ちます。モデル側でキャストクラスを知らなくて済むため、ドメインロジックが整理されます。
$appends と $hidden との相互作用
キャストと $appends、$hidden は独立した仕組みですが、組み合わせるときに注意が必要です。
実行時キャストの追加
特定のクエリやリクエストだけキャストを追加したいときはmergeCasts メソッドを使います。
次のステップ
Eloquent Observer とモデルイベント
モデルの保存・削除などのライフサイクルイベントにフックして処理を追加する方法を学びます。