Skip to main content

はじめに

アクセサミューテタ属性キャストは、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() メソッドで配列を返します。

組み込みキャスト一覧

null の属性はキャストされません。また、リレーション名と同じ名前のキャストや、主キーへのキャストは定義しないでください。

Stringable キャスト

AsStringable を使うと、属性を Illuminate\Support\Stringable オブジェクトとして扱えます。

配列・JSON キャスト

JSON/TEXT カラムを PHP 配列として透過的に扱えます。
-> 演算子で JSON の特定キーだけを更新することもできます。

AsArrayObject / AsCollection キャスト

標準の array キャストは、配列の特定オフセットを直接変更しようとするとエラーになります。AsArrayObjectAsCollection を使うとこの問題を回避できます。
カスタムコレクションクラスを使いたい場合は using() を指定します。

日時キャスト

created_at / updated_at はデフォルトで Carbon にキャストされます。追加の日時カラムも同様に定義できます。
フォーマットを指定すると、JSON シリアライズ時にそのフォーマットが使われます。
すべての日付のデフォルトシリアライズフォーマットを変えたい場合は serializeDate() をオーバーライドします(DB保存フォーマットには影響しません)。
immutable_datetime を使うと Carbon の代わりに CarbonImmutable が返ります。元のインスタンスを変更せずに日時操作できるため、副作用のないコードを書きやすくなります。

Enum キャスト

PHP 8.1 以降の Backed Enum をキャストとして指定できます。
DBには Enum のバッキング値(string または int)が保存され、取得時には Enum インスタンスに変換されます。

Enum の配列キャスト

複数の Enum 値を1カラムに配列として保存したい場合は AsEnumCollection を使います。

クエリ時のキャスト

クエリ実行時に動的にキャストを適用するには withCasts() を使います。

カスタムキャスト

独自のキャストクラスを作成することも可能です。CastsAttributes インターフェースを実装し、getset メソッドを定義します。
詳細な実装方法(Value Object パターン、インバウンドキャスト、Castables など)は以下の上級ページを参照してください。

カスタムキャスト詳解

CastsAttributes インターフェースの実装方法や、Value Object パターン・Castables など上級のカスタムキャストを解説します。

関連ページ

Eloquent APIリソース

モデルを一貫したJSON APIレスポンスに変換するリソースクラスの使い方を確認します。
最終更新日 2026年4月12日