Laravelのバージョンは7.*を想定
例題
例えばPostモデルと、Tagモデルがあるとします。
PostとTagは多対多で成り立ちます。
Postの作成、編集画面で、Tagの一覧を表示して、チェックボックス等で紐づけを行いたいとき
バリデーション無視して書くと
create.blade.php
@foreach(\App\Models\Tag::get() as $tag)
<label>
<span>{{ $tag->name }}</span>
<input type="checkbox" name="tags[]" value="{{ $tag->id }}">
</label>
@endforeach
みたいな感じでformタグ内にぶち込めばいいんですよ。※bladeにモデル書いてるのはサンプルのため!
ただ、この場合、**配列の時のold
関数ってどうだっけ?**ってよくなるので備忘録です。
結論
- インプットの配列に添え字を明示的に入れる
old
関数の引数として、文字列結合で添え字をドットでつなげる
そしてそのold
関数で取得した値が、foreach
で回している$tag
のid
と同じであれば、checkedを付ける!
create.blade.php
@foreach(\App\Models\Tag::get() as $key => $tag)
<label>
<span>{{ $tag->name }}</span>
<input type="checkbox" name="tags[{{ $key }}]" value="{{ $tag->id }}" @if(old('tags.' . $key) == $tag->id) checked="checked" @endif>
</label>
@endforeach
明示的に書いてPOSTするので、バリデーションのリターンもしっかりついてる!