質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.77%

【PHP,Laravel】bladeの@foreach内で@if文を書くときに{{ $hobby->id }}のように値を渡したい。

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 345

score 2

前提・実現したいこと

現在、LaravelのBladeにて表題の通り、Bladeでチェックを付けたチェックボックスのチェック状態を保持する機能を実装したいのですが、どうしても詰まってしまっています。

具体的には、検索画面で、複数チェックを付けた状態で画面遷移した際にそれぞれチェックを付けた状態にしたいということです。

何かしらのアドバイスをいただけると助かります。よろしくお願いいたします。

発生している問題・エラーメッセージ

表題の通り、検索画面でチェックしたチェックボックスの状態を保持するために、bladeの@foreach内で@if文を書くときに{{ $hobby->id }}のように値を渡したいのですが、{{ $hobby->id }}だと「該当のソースコード」のエラーになってしまいます。

該当のソースコード

<!-- 補足。このコメントアウトの処理はController側で行っています。
※検索条件の取得
$searchCondition[] = array();
$searchCondition = [
  'hobbies' => $request->input('hobby'),
];

※DBから取得した趣味テーブルのデータを$hobbiesとして扱っている。入っているデータは以下の通り。
$hobbies[] = array();
$hobbies = [
  'id' => ['1', '2', '3'・・・・],
  'name' => ['ゲーム', '映画', 'スポーツ'・・・]
];
-->

<!-- Blade -->
<div>
@foreach($hobbies as $hobby)
 <input id="hobbies{{ $hobby->id }}" type="checkbox" value="{{ $hobby->id }}" name="hobby[]" @if(isset($searchCondition['hobbies']) && array_search({{ $hobby->id }}, $searchCondition['hobbies'])) checked @endif/>
 <label class="search-checkbox" for="hobbies{{ $hobby->id }}">{{ $hobby->name }}</label>
@endforeach
<div>

⇒以下のエラーになってしまう。

Symfony\Component\Debug\Exception\FatalThrowableError
syntax error, unexpected '<' (View: C:\xampp\htdocs\(※プロジェクト名)\resources\views\(※質問対象のblade名).blade.php)

おそらく、@if @endifの中は通常のphpのコードで書く必要があり、{{ $hobby->id }}の「>」が反応してくれない模様。

試したこと

★array_search({{ $hobby->id }}, $searchCondition['hobbies']))の{{ $hobby->id }}を$hobby['id']にする。
<!-- Blade -->
<div>
@foreach($hobbies as $hobby)
<input id="hobbies{{ $hobby->id }}" type="checkbox" value="{{ $hobby->id }}" name="hobby[]" @if(isset($searchCondition['hobbies']) && array_search($hobby['id'], $searchCondition['hobbies'])) checked @endif/>
<label class="search-checkbox" for="hobbies{{ $hobby->id }}">{{ $hobby->name }}</label>
@endforeach
<div>

⇒bladeで2つ上選択した際に、$hobby->idが一番大きいチェックボックスのみチェック状態が保持されてしまう。

1つのみ選択した際にチェック状態が保持されない&2つ以上選択した際にチェックを付けたすべてのチェックボックスのチェック状態を保持することができていない状態です。

補足情報(FW/ツールのバージョンなど)

【バージョン】
〇Laravel Framework 6.20.16

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

★array_search($hobby['id'], $searchCondition['hobbies']))の$hobby['id']を{{ $hobby->id }}にする。
⇒以下のエラーになってしまう。

この表現をみるに、PHPの連想配列やクラス・オブジェクトの理解が足りていないと思われます。$hobbiesの中の要素も配列ですから$hobby->idが出てくる幕はありません($hobby->idは$hobbyがクラスのインスタンスの場合に使用できる)。

あと、foreachの使い方も完全に理解されてないと思いますが、$hobby['id']も存在しません。
この場合、ループ1周目の$hobby['1', '2', '3'・・・・]、2周目の$hobby['ゲーム', '映画', 'スポーツ'・・・]が入ってきます。このデータだと単純なforeachだけでチェックボックスを作るのは無理ですね。コントローラー側でcheckboxを作りやすいようにデータの形式を調整した方が良いでしょう。

$hobbies = [
  '1' => 'ゲーム',
  '2' => '映画',
  '3' => 'スポーツ'
];
@foreach($hobbies as $id => $hobby) {
   <input id="{{ $id }}" value="{{ $hobby }}" type="checkbox">
}

みたいな感じでやるのが一般的じゃないですかね。checkedのあたりは何がしたいのがよく分からないので言及できませんが・・・・

まずはチェックボックスよりもPHPの配列の基礎を学ばれた方が良さそうです。
https://www.sejuku.net/blog/11981

あと、蛇足になるかもしれませんがこういう面倒な処理をしなくていいようにLaravel Collectiveって便利なものがありますので、こちらも見たら良いかもしれません。
https://laraweb.net/practice/7965/

チェックボックスとかだとチェックの有無の処理とか自前でやるのは面倒なだけです。せっかくLaravel使ってるのであれば、この辺は楽したいですね。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/04/12 17:40 編集

    ご丁寧に回答いただき本当にありがとうございます。
    「PHPの連想配列やオブジェクトの理解が足りていない、foreachの使い方も完全に理解していない」というのは確かにその通りです。

    どれも苦手意識があり、いまだに慣れないものばかりでして...

    記事も共有していただきありがとうございました。
    二次元配列まではまだ理解が追いつくのですが、多次元配列になると、本記事で出てくる例だとまだ理解できるのですが、これを他に当てはめて考えると、イマイチイメージが湧かないのが現状です。

    もう少しじっくり読んでみたいと思います。

    Laravel Collectiveでの実装も検討したのですが、社内にLaravelに精通している方が少なく、可読性を少しでも上げるためにLaravel独自の文法でなるだけ書かないようにと指示が出ており、手が非常に出しにくいのです。

    今回は、そもそも違うアプローチをすることで解消できましたが、また別の質問でお世話になるかもしれません。

    その際は、大変お手数ですが、改めてよろしくお願いいたします。

    キャンセル

0

パッと見なのですが、inputタグのname="$hobby[]"はname="hobby[]" の誤りではないでしょうか?

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2021/04/09 10:04 編集

    そうですね。実際に開発しているコードではname="hobby[]"でしたが、質問する際にタイプミスでname="$hobby[]"になってしまっていたようです。

    質問内容を修正しました。

    本来はname="hobby[]"で実行した結果が「該当のソースコード」、「試したこと」の内容です。

    キャンセル

0

そもそも、array_searchを使わないというアプローチで解決しました。

<div>
@foreach($hobbies as $hobby)
 <input id="hobbies{{ $hobby->id }}" type="checkbox" value="{{ $hobby->id }}" name="hobby[]" 
   @isset($searchCondition['hobbies'])  
        @foreach($searchCondition['hobbies'] as $searchHobbies)
            @if($hobby['id'] == $searchHobbies)
                checked
            @endif
        @endforeach
    @endisset/>
 <label class="search-checkbox" for="hobbies{{ $hobby->id }}">{{ $hobby->name }}</label>
@endforeach
</div>

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.77%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る