LoginSignup
1
3

More than 1 year has passed since last update.

セレクトボックスにDBの値を反映させて、editとcreateで使い回したい。

Posted at

はじめに

セレクトボックスを使用した入力項目を実装しました。
その際に、以下の2つの実装で詰まったため記録として残します。

  1. 投稿したものを編集する際、DBの値がセレクトボックスに反映されない
  2. editcreateでbladeの使い回し

条件

・ mac OS 11.2.3 Big Sur
・ Laravel Framework 6.20.27
・ PHP 8.0.7
・ nginx 1.18
・ mysql 8.0

1. 投稿済みのものを編集する際、DBの値がセレクトボックスに反映されない

値はDBに保存できており、レシピの詳細ページに保存されているデータが渡ってきている。
→ セレクトボックスが初期値のまま

form.blade.phpは、編集画面(edit)新規作成画面(create)とで使い回しています。)

1.1 編集前

form.blade.php一部抜粋
<div class="form-group mt-3">
   <label for="meal_type_id">料理の種類</label>
   <select name="meal_type_id" class="custom-select form-control pl-4">
       @foreach($meal_types as $meal_type)
           <option value="{{ $meal_type->id }}" {{ old('meal_type') == $meal_type->id ? 'selected' : '' }}>
             {{ $meal_type->name }}
           </option>
       @endforeach
    </select>
</div>

1.2 編集後

form.blade.php一部抜粋
<div class="form-group mt-3">
   <label for="meal_type_id">料理の種類</label>
   <select name="meal_type_id" class="custom-select form-control pl-4">
       @foreach($meal_types as $meal_type)
          // ---- ここから ----
           <option value="{{ $meal_type->id }}" {{ old('meal_type', $recipe->meal_type_id) == $meal_type->id ? 'selected' : '' }}>
         // ---- ここまで ----
             {{ $meal_type->name }}
           </option>
       @endforeach
    </select>
</div>

$recipe->meal_type_idold( )の第二引数に追加。
old( )第二引数に指定したものをデフォルト値として設定できる。
これで、一度投稿したものを編集する時でも、セレクトボックスが選択されている状態になっている。

Laravel 7.x old( ) について

2. editcreateでbladeの使い回し

値の反映は実装できたものの、レシピを新規作成しようとしたところ、以下のエラー。
スクリーンショット 2021-06-28 17.50.58.png
$recipeが定義されてないと言われた。

$recipe->meal_type_idを追加したことで新たにエラーが出現...。
しばらく格闘した結果、以下の実装で丸く収まった。

2.1 編集後

form.blade.php一部抜粋
<div class="form-group mt-3">
   <label for="meal_type_id">料理の種類</label>
   <select name="meal_type_id" class="custom-select form-control pl-4">
       @foreach($meal_types as $meal_type)
          // ---- ここから ----
           <option value="{{ $meal_type->id }}" {{ old('meal_type', $recipe->meal_type_id ?? '') == $meal_type->id ? 'selected' : '' }}>
         // ---- ここまで ----
             {{ $meal_type->name }}
           </option>
       @endforeach
    </select>
</div>

2.2 変更点

<option>タグの以下の部分を編集。

{{ old('meal_type', $recipe->meal_type_id ?? '')

{{ old('meal_type', $recipe->meal_type_id)では、
edit:第二引数の値を取得
create:第二引数を取得しようとしてエラー($recipeが定義されていない)

{{ old('meal_type', $recipe->meal_type_id ?? '')では、
edit:第二引数の$recipe->meal_type_idを取得
create:第二引数のnull合体演算子で値が取れなかった場合、''を取得

null合体演算子:php.net

おわり

今回の実装で、
old( )の使い方
・ セレクトボックスの値の保持
・ blade内でeditcreateの表示の分岐
など、多くのことを学ぶ事ができました!

引き続き実装頑張っていきます!

参考

以下のサイトも参考にさせていただきました。

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3