Help us understand the problem. What is going on with this article?

Laravel5.7で動的チェックボックス(checkbox)のoldの操作について

少しハマったのでチェックボックスの時のold操作でハマったので備忘録。そもそもLaravel側もメソッド用意してほしい

編集画面やエラー画面などで入力フォームの値を取得したい時oldヘルパーが便利ですよね。
こうするだけで入力フォームの値が取れるので重宝しています。

edit.blade/php
//前の入力画面の<input type="text" name="user">から値を取得
{{ old('user') }}

これを動的なタグのチェックボックスを使って試してみる
※テーブルの中身はidとnameの単純なもの

edit.blade.php
@foreach ($tags as $tag)
    <div class="form-check">
        <input type="checkbox" name="tag[]" id="tag{{ $loop->iteration }}" value="{{ $tag->id }}" @if (old('tag') == $loop->iteration) checked @endif>
        <label for="tag{{ $loop->iteration }}">{{ $tag->name }}</label>
    </div>
@endforeach

上記はtagのIDとforeachで回した時のカウント数が一致した時にcheckedを付けるという処理。
しかしこんなエラーが。。

htmlspecialchars() expects parameter 1 to be string, array given...

これは値が配列のために出るエラーですね。

調べたらすぐヒットしました!

edit.blade.php
<input type="checkbox" name="tag[]" id="tag{{ $loop->iteration }}" value="{{ $tag->id }}" @if (is_array(old("tag")) && in_array("1", old('tag'), true)) checked @endif>

ただこれだと"1"の部分が決めうちになってしまい、
今回のように動的な値のチェックボックスは全てにcheckedがついてしまう。

そこであまりスマートではないですが、"$tag->id"で文字列展開してください。
※ダブルクォーテーションを外すとint型になり一致しません。(oldは文字列のため)

edit.blade.php
<input type="checkbox" name="tag[]" id="tag{{ $loop->iteration }}" value="{{ $tag->id }}" @if (is_array(old("tag")) && in_array("$tag->id", old('tag'), true)) checked @endif>

これでイケるはず。

最後に

Laravel便利だけどもう少しbladeの自由度を高めてほしい。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away