結論はこれ
<input type="radio" name="test" value="1"
{{ old("test") == 1 ? "checked" : "" }} />
```
結論上の通りです。
`{{ }}`の中に三項演算子の内容を記述する。
{{ 条件 ? true : false }}
`old()`でリダイレクト前の回答を取得しています。
{{ old('nameの名前') ? "checked" : "何もしない" }}
# 他の書き方を知る
## @ifを使う
````php:@ifを使う
@if(条件) checked @enfif
<input type="radio" name="test" value="1" @if(old("test") == 1) checked @endif />
nameが配列の場合
下記のように、nameを配列で管理したい場合がある。
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}">
この場合はどうすればよいでしょうか?
STEP1:条件を入れる
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}"
{{ in_array((int)$testId, old('test_ids')) ? checked : "" }}>
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}"
@if(in_array((int)$testId, old('test_ids')) checked @endif>
- ポイント:[]はいらない。old('配列')で配列を取得
- in_array(配列に含まれているか確認したいターゲット, 配列)でtrue, falseでチェック
STEP2:old()の引数を増やす
old()ですが、投稿後は表示可能ですが、投稿する前はデータがないので表示できず、エラーの原因になります。
そのため、第二引数にデフォルト値を追加します
old(表示させたいname, デフォルト値:第一引数がない場合に使用)
この第二引数は、editなどの編集画面でよく使います。
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}"
@if(in_array((int)$testId, old('test_ids', $data['test_ids'])) checked @endif>
こうすることで、old('test_ids')がnull
でも$data['test_ids']があるので、in_array()が実行されます。
しかし、まだエラーの要因があります
STEP3:型を揃える
コードの補完性を高めるために、型を指定したいはずです。その手順をお伝えしていきます
in_array(配列に含まれているか確認したいターゲット, 配列, true)
trueを入れない場合、 "=="で実行されます。文字の場合は文字数がintとされてしまいます。
つまり、通って欲しく無い場合も通過します
なので、 型まで厳密にチェックする"==="を利用したいです。そこでtrueを追加します
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}"
@if(in_array((int)$testId, old('test_ids', $data['test_ids']), true) checked @endif>
これで型までチェックされるようになります。
そうするとエラーが発生します。
配列の型を指定する(キャスト)
old('name')で取得した値はstring型です。
なので、
old('test_ids', $data['test_ids'])
// old('string型の配列', 'int型の配列')
のように、配列の中身の値が、"string"と"int"で違う場合があります。
こうなると
in_array(配列に含まれているか確認したいターゲット(int型), old("string"の配列, intの配列), true)
のように、第一引数がint型の場合、old('test_ids')で取得した配列はstring型のためエラーになります。
なので、配列の型を決めます。
array_map(実行したい関数, 対象の配列)
array_map('intval', 対象の配列)
array_map('intval', old('test_ids', $data['test_ids']))
array_map('strval', 対象の配列)
array_map('strval', old('test_ids', $data['test_ids']))
これで配列の中身を一気にキャスト(型指定)します
ターゲットの型を指定する(キャスト)
配列の中身の型を指定できたところで、ターゲットの中身もキャストしていきましょう
(型) 対象の値
で型指定します。
(int)$testId
(string) $testId
これでターゲットの型を指定できます。
簡単ですよね
これらを合算します
<input type="checkbox" name="test_ids[]" value="{{ $test_id }}"
@if(in_array((int)$testId, array_map('intval',old('test_ids', $data['test_ids']))) checked @endif>
これで
@if(in_array('int型のターゲット', 'int型の配列')) checked @endif
が成立します。
初期値でもチェックされますし、oldで投稿後の値でもチェックされます