Filament でフォームを実装していると、dehydrated() というメソッドを見かけることがあります。名前から何となく「データを取り出す系」の処理だとは感じますが、具体的にどういう意味を持つのかは少し分かりにくいです。この記事では、dehydrate という概念から整理してみます。
dehydrate とはどういう意味か
Filament における「dehydrate(脱水)」は、フォームの内部状態を保存用のデータ配列に変換する処理のことです。
[ フォーム UI の状態(Livewire の state)]
↓(dehydrate)
[ モデルに保存するためのデータ配列 ]
↓
[ DB 保存 ]
「脱水」という言葉が示す通り、UI上の余分な情報を取り除いて純粋なデータだけにするイメージです。逆向きの処理、つまり DB から値を読み込んでフォームに流し込む方向は「hydrate(水分補給)」と呼ばれています。
| 方向 | 処理名 | 概要 |
|---|---|---|
| DB → フォーム | hydrate | 保存値をフォームに読み込む |
| フォーム → DB | dehydrate | フォームの状態を保存用に変換する |
dehydrated() メソッドの役割
dehydrated() は、フィールドごとに「この値を保存対象に含めるかどうか」を制御するメソッドです。
TextInput::make('name')
->dehydrated(true)
true(デフォルト)を渡すとそのフィールドは保存対象になります。逆に false を渡すと、フォームの UI には表示されていてもデータ配列には含まれなくなります。
TextInput::make('password_confirmation')
->dehydrated(false)
この指定だけで、確認用パスワード入力欄の値が DB に保存されなくなります。
よくある活用パターン
確認用フィールドを保存しない
パスワード変更フォームでは「パスワード確認」欄を UI に置きますが、DB に保存するのは本体のパスワードだけです。dehydrated(false) を使うと余計なカラムを意識せずに済みます。
TextInput::make('password_confirmation')
->password()
->dehydrated(false)
入力があったときだけ保存する
クロージャーを使うと、条件付きで保存を制御できます。次の例はパスワードが入力されたときだけ更新し、未入力なら既存の値をそのまま維持したい場合の典型パターンです。
TextInput::make('password')
->password()
->dehydrated(fn ($state) => filled($state))
filled() は Laravel ヘルパーで、null や空文字列のときに false を返します。これにより、パスワード欄を空のまま保存しても既存パスワードが上書きされるのを防げます。
表示専用フィールドを保存しない
disabled() にしたフィールドは編集できませんが、Filament のデフォルト動作では保存対象から除外されます(内部的に dehydrated(false) と同じ扱い)。ただし明示的に書いておくと意図が分かりやすくなります。
TextInput::make('email')
->disabled()
->dehydrated(false)
まとめ
dehydrated() は一言で言えば「このフィールドを保存対象にするかどうか」を決めるメソッドです。
dehydrated(true)→ 保存する(デフォルト)dehydrated(false)→ UI にはあるが DB には保存しない- クロージャーを渡すと条件付きで制御できる
フォームの都合で必要な入力欄と、実際に DB へ渡したいデータを分けて考えると、どこで dehydrated(false) を使うべきかが見えてきます。