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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

Q&A

解決済

3回答

4163閲覧

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

kz.engineer

総合スコア2

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Blade

Bladeとは、 PHPフレームワークのLaravelで使用することができるテンプレートエンジンです。テンプレートの継承とエスケープ機能を提供します。

0グッド

0クリップ

投稿2021/04/08 14:42

編集2021/04/09 01:19

前提・実現したいこと

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

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

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

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

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

該当のソースコード

PHP

1<!-- 補足。このコメントアウトの処理はController側で行っています。 2※検索条件の取得 3$searchCondition[] = array(); 4$searchCondition = [ 5 'hobbies' => $request->input('hobby'), 6]; 7 8DBから取得した趣味テーブルのデータを$hobbiesとして扱っている。入っているデータは以下の通り。 9$hobbies[] = array(); 10$hobbies = [ 11 'id' => ['1', '2', '3'・・・・], 12 'name' => ['ゲーム', '映画', 'スポーツ'・・・] 13]; 14--> 15 16<!-- Blade --> 17<div> 18@foreach($hobbies as $hobby) 19 <input id="hobbies{{ $hobby->id }}" type="checkbox" value="{{ $hobby->id }}" name="hobby[]" @if(isset($searchCondition['hobbies']) && array_search({{ $hobby->id }}, $searchCondition['hobbies'])) checked @endif/> 20 <label class="search-checkbox" for="hobbies{{ $hobby->id }}">{{ $hobby->name }}</label> 21@endforeach 22<div> 23 24⇒以下のエラーになってしまう。 25 26Symfony\Component\Debug\Exception\FatalThrowableError 27syntax error, unexpected '<' (View: C:\xampp\htdocs(※プロジェクト名)\resources\views\(※質問対象のblade名).blade.php) 28 29おそらく、@if @endifの中は通常のphpのコードで書く必要があり、{{ $hobby->id }}の「>」が反応してくれない模様。 30

試したこと

★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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

★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/09 02:35

編集2021/04/12 16:21
AbeTakashi

総合スコア4537

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kz.engineer

2021/04/12 08:41 編集

ご丁寧に回答いただき本当にありがとうございます。 「PHPの連想配列やオブジェクトの理解が足りていない、foreachの使い方も完全に理解していない」というのは確かにその通りです。 どれも苦手意識があり、いまだに慣れないものばかりでして... 記事も共有していただきありがとうございました。 二次元配列まではまだ理解が追いつくのですが、多次元配列になると、本記事で出てくる例だとまだ理解できるのですが、これを他に当てはめて考えると、イマイチイメージが湧かないのが現状です。 もう少しじっくり読んでみたいと思います。 Laravel Collectiveでの実装も検討したのですが、社内にLaravelに精通している方が少なく、可読性を少しでも上げるためにLaravel独自の文法でなるだけ書かないようにと指示が出ており、手が非常に出しにくいのです。 今回は、そもそも違うアプローチをすることで解消できましたが、また別の質問でお世話になるかもしれません。 その際は、大変お手数ですが、改めてよろしくお願いいたします。
guest

0

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

php

1<div> 2@foreach($hobbies as $hobby) 3 <input id="hobbies{{ $hobby->id }}" type="checkbox" value="{{ $hobby->id }}" name="hobby[]" 4  @isset($searchCondition['hobbies']) 5 @foreach($searchCondition['hobbies'] as $searchHobbies) 6 @if($hobby['id'] == $searchHobbies) 7 checked 8 @endif 9 @endforeach 10 @endisset/> 11 <label class="search-checkbox" for="hobbies{{ $hobby->id }}">{{ $hobby->name }}</label> 12@endforeach 13</div>

投稿2021/04/12 08:49

編集2021/04/12 08:50
kz.engineer

総合スコア2

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

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

投稿2021/04/09 00:24

workshajikoma

総合スコア110

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kz.engineer

2021/04/09 01:26 編集

そうですね。実際に開発しているコードではname="hobby[]"でしたが、質問する際にタイプミスでname="$hobby[]"になってしまっていたようです。 質問内容を修正しました。 本来はname="hobby[]"で実行した結果が「該当のソースコード」、「試したこと」の内容です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問