役立つ情報
登録日: 2025-03-06   最終更新日: 2025-03-23

Laravel DB取得データ と old が混在する場合

フォームにおいて、DBのデータと old() をうまく共存させるには、次のような方法を使います。

old() の値があれば優先し、なければDBの値を使う

フォームが送信された後の バリデーションエラー時 は、old() の値を優先し、初回表示時や編集時には DBの値を表示 する方法です。


<input type="text" name="title" value="{{ old('title', $post->title ?? '') }}">

ポイント

  • old('title') の値があれば、それを使用(フォーム送信後の値を保持)
  • old('title') がなければ、$post->title を使用(DBの値)
  • $post->title が null の場合は、空文字 '' をセット

チェックボックスの場合

チェックボックスでは old() の値があるかどうかを checked で制御します。


<input type="checkbox" name="subscribe" value="1"
    {{ old('subscribe', $user->subscribe ?? false) ? 'checked' : '' }}>

ポイント

  • old('subscribe') が true なら checked
  • old('subscribe') が null なら $user->subscribe の値を参照
  • $user->subscribe も null なら false

ラジオボタンの場合

ラジオボタンの場合も old() を優先し、DBの値をデフォルトにする。


<label>
    <input type="radio" name="gender" value="male"
        {{ old('gender', $user->gender ?? '') == 'male' ? 'checked' : '' }}>
    男性
</label>

<label>
    <input type="radio" name="gender" value="female"
        {{ old('gender', $user->gender ?? '') == 'female' ? 'checked' : '' }}>
    女性
</label>

ポイント

  • old('gender') がある場合、その値を比較して checked
  • ない場合は $user->gender を参照

複数選択可能なチェックボックス

配列データを扱うチェックボックスは、in_array() を使う。


@php
    $selectedTags = old('tags', $post->tags ?? []);
@endphp

<label>
    <input type="checkbox"
           name="tags[]"
           value="news"
           {{ in_array('news', $selectedTags) ? 'checked' : '' }}>
    ニュース
</label>

<label>
    <input type="checkbox"
           name="tags[]"
           value="tech"
           {{ in_array('tech', $selectedTags) ? 'checked' : '' }}>
    テクノロジー
</label>

<label>
    <input type="checkbox"
           name="tags[]"
           value="sports"
           {{ in_array('sports', $selectedTags) ? 'checked' : '' }}>
    スポーツ
</label>

ポイント

  • old('tags') がある場合、それを優先
  • old('tags') がない場合、DBの $post->tags を使う
  • $post->tags が null の場合は空配列 [] にする

セレクトボックス(ドロップダウン)の場合

old() の値があれば優先し、なければDBの値を使用。


<select name="category">
    <option value="news" {{ old('category', $post->category ?? '') == 'news' ? 'selected' : '' }}>ニュース</option>
    <option value="tech" {{ old('category', $post->category ?? '') == 'tech' ? 'selected' : '' }}>テクノロジー</option>
    <option value="sports" {{ old('category', $post->category ?? '') == 'sports' ? 'selected' : '' }}>スポーツ</option>
</select>

ポイント

  • old('category') がある場合、それを selected
  • ない場合は $post->category を使用

コントローラーの処理

バリデーションエラー時に old() を使うには、コントローラーで withInput() を使います。


public function update(Request $request, Post $post)
{
    $validated = $request->validate([
        'title' => 'required|string|max:100',
        'subscribe' => 'nullable|boolean',
        'gender' => 'required|in:male,female',
        'tags' => 'nullable|array',
        'category' => 'required|string',
    ]);

    // データ保存処理
    $post->update($validated);

    return redirect()->route('posts.edit', $post)->with('success', '更新しました');
}

ポイント

  • validate() でバリデーション
  • エラーがあると old() に値が入る
  • 成功時はリダイレクト

Copyright 役立つ情報.net