Skip to main content

キャストとは

Eloquentのキャストは、データベースから取得した生の値をPHPのデータ型に変換し、保存時にはその逆変換をする仕組みです。casts メソッドで定義します。

組み込みキャストの種類

Laravelが標準で提供するキャスト一覧です。
AsArrayObjectAsCollection は、配列の特定のオフセットを直接変更できるように、Laravel内部でカスタムキャストとして実装されています。

カスタムキャストクラスの作成

組み込みキャストでは対応できない変換が必要な場合、CastsAttributes インターフェースを実装したカスタムキャストを作成します。

インターフェースの定義

フレームワーク本体のコントラクトは次のように定義されています。
$attributes 引数にはモデルの全属性が入っているため、複数のカラムをまたいだ変換も可能です(後述のValue Objectパターン参照)。

基本的なカスタムキャストの実装

make:cast コマンドで雛形を生成します。
app/Casts/AsMoney.php が生成されます。例として金額(整数で保存)を Money Value Objectに変換するキャストを実装します。
モデルにキャストを適用します。
これで $order->priceMoney インスタンスを返します。

Value Objectキャスト

複数のDBカラムをまとめて1つのValue Objectとして扱うパターンです。

実装例: 住所キャスト

address_line_oneaddress_line_two の2カラムを Address Value Objectにまとめます。
set メソッドで配列を返すと、Eloquentはキーをカラム名として、値をそれぞれのカラムに保存します。単一カラムのキャストでは文字列や整数を返します。
モデルへの適用と使い方は次のとおりです。

Value Objectのキャッシュ

Value Objectに変換された属性値はEloquentによってキャッシュされます。同じ属性に2回アクセスしても、同じオブジェクトインスタンスが返ります。 キャッシュを無効化したい場合は $withoutObjectCaching プロパティをキャストクラスに追加します。

インバウンドキャスト(書き込み専用)

DBへの書き込み時にのみ変換を行い、読み取り時には変換しないキャストです。CastsInboundAttributes インターフェースを実装します。 典型的な用途はハッシュ化です。パスワードや秘密値を保存するときだけ変換し、読み取り時はハッシュ値をそのまま返します。

キャストパラメータ

カスタムキャストにパラメータを渡す場合は、クラス名の後にコロン区切りで指定します。複数のパラメータはカンマ区切りです。
パラメータはキャストクラスのコンストラクタに渡されます。

Castables: Value Object側にキャストロジックを持たせる

Castable インターフェースを実装した Value Object は、自身のキャストクラスを返す castUsing メソッドを持ちます。モデル側でキャストクラスを知らなくて済むため、ドメインロジックが整理されます。
モデル側はキャストクラスの代わりに Value Object クラスを指定します。
Castable と無名クラスを組み合わせると、Value Objectとキャストロジックをひとつのファイルにまとめられます。

$appends$hidden との相互作用

キャストと $appends$hidden は独立した仕組みですが、組み合わせるときに注意が必要です。
$hidden に指定するのはDBのカラム名です。キャストを通じて作られる属性名(address)ではなく、元のカラム名(address_line_one, address_line_two)を指定します。

実行時キャストの追加

特定のクエリやリクエストだけキャストを追加したいときは mergeCasts メソッドを使います。

次のステップ

Eloquent Observer とモデルイベント

モデルの保存・削除などのライフサイクルイベントにフックして処理を追加する方法を学びます。
最終更新日 2026年3月28日