laravel5.8¦複数チェックボックスでoldを使用してバリデーションエラー時にcheckedをつける

2 min read読了の目安(約2000字

bladeファイルのチェックボックスに難航したのでまとめ‥

やりたいこと

・チェックボックスは複数存在している
・バリデーションエラーになった場合にチェックボックスの内容をチェックしたままにしたい

参考にさせていただきました!
Laravel チェックボックスのchecked="checked"はどうやって表示させるの?

環境

・laravel 5.8
・php 7.2

チェックボックスのデータについて

今回のチェックボックス用のデータですがDBにあるデータを使用しており、キーがid/値が名前の連想配列を使用しています。

$allRoomTypes = array(
  1 => Single,
  2 => Double,
  3 => Twin,
  4 => Triple,
  5 => Suite,
  6 => Connecting rooms
);

is_arrayとin_arrayをつかう

調べるとよくでてきますね!name=type[]とします。

{{ is_array(old(‘type’)) && in_array($id, old(‘type’), true)? ‘checked=“checked”’ : ‘’ }}

oldだとstringになってしまうようで、特に何もおこらず、
in_arrayの中で型をin_array($id, (int)old(‘type’), true)のように指定するとエラーになります( ´ ` )

in_array() expects parameter 2 to be array, int given

色々試行錯誤してみたもののうまくいかず、期待していた動作になりませんでした( ´ ` )

is_arrayとarray_keysに修正!

is_arrayとin_arrayでうまくいかなかったので、is_arrayとarray_keysにしました。

 @foreach($allRoomTypes as $id => $allRoomType)
   <input type="checkbox" name="type[]" id="{{ $allRoomType }}" value="{{ $id }}"@if($errors->any()){{ is_array(old('type')) && array_keys(old('type'), $id)? 'checked="checked"' : '' }}@endif/>
   <label for="{{ $allRoomType }}">{{ $allRoomType }}</label>
 @endforeach

新規登録画面のような初期値がなく、バリデーションエラー時に直前の入力内容を保持する実装は完了です◎

編集画面の場合

編集画面のような、
・ 初期値はDBに保存してある値
・ バリデーションエラー時は直前の入力内容を優先して表示させたい場合🐍

その時は$roomTypesにDBに保存している値を入れておいてin_arrayで比較したところできました👌

  @foreach($allRoomTypes as $id => $allRoomType)
    <input type="checkbox" name="type[]" id="{{$allRoomType}}" value="{{ $id }}"
@if($errors->any()){{ is_array(old('type')) && array_keys(old('type'), $id)? 'checked="checked"' : '' }}@else{{ in_array($id, $roomTypes, true)? 'checked="checked"' : '' }}@endif/>
    <label for="{{$allRoomType}}">{{ $allRoomType }}</label>
  @endforeach

①ifで最初に判定するのはエラーがあった場合、つまり直前に入力した値を優先
②エラーがない場合はDBに保存されている値を表示
①→②の順で判定することで編集画面の場合も想定した動きになりました◎

🐍🐍🐍

bladeのチェックボックスはなかなか厄介ですね( ´ ` )
なんとか今回は想定した動きにできたのですが、もっといい方法がある気がする‥