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

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

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

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

PHP

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

Q&A

解決済

1回答

4690閲覧

LaravelのForm::select(multiple)で初期値を設定したい

KumaChan

総合スコア37

Laravel

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

PHP

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

0グッド

0クリップ

投稿2020/10/29 00:19

編集2020/10/29 01:29

Laravel(6.18.40)のFormファザードを使って会員検索フォームを作成しています。
初回アクセス時に入力された検索条件をDBに保存し、再アクセス時にはDBから呼び出して各要素の初期値として反映させたく考えています。

以下はそのソースコード(ビュー)です。

各セレクト要素の第三引数にDBから呼び出した初期値を設定しています。
第二引数のconfigは、それぞれ配列で「array('1'=>'男性','2'=>'女性'…」「array('1'=>'北海道','2'=>'青森県'…」といった値を用意しています。

@section('content') {{Form::open()}} <table class="common"> <tr> <th>性  別</th> <td>{{Form::select('sex', config('sex'), optional($data)->sex)}}</td> </tr> <tr> <th>都道府県</th> <td>{{Form::select('pref[]', config('pref'), optional($data)->pref, ['multiple' => 'multiple'])}}</td> </tr> <tr> <th>年  齢</th> <td> {{Form::select('age01', config('age'), optional($data)->age01)}}<span class="small"> 歳</span>~ {{Form::select('age02', config('age'), optional($data)->age02)}}<span class="small"> 歳</span></td> </tr> <tr> <td colspan="2" class="center">{{Form::hidden('save', 0)}}{{Form::checkbox('save', 1, null, ['id'=>'save'])}}<label for="save">この条件を保存</label></td> </tr> <tr> <td colspan="2" class="button">{{Form::submit('この条件で検索', ['class'=>'button'])}}</td> </tr> </table> {{Form::close()}} @endsection

呼び出す初期値ですが、DBでは以下のデータ型と値(今回の例)を設定しています。

$data->sex:整数型(値:2)
$data->pref:配列をテキスト型で保存(値:["1","3","5"])
$data->age01:整数型(値:20)
$data->age02:整数型(値:30)

これにより、性別「女性」、都道府県「北海道、岩手県、秋田県」、年齢「20~30」となることを想定しています。

以下は実行した際の実際の画面キャプチャです。単一選択型の「性別」と「年齢」は反映されていますが、複数選択型の「都道府県」が反映されていません。

イメージ説明
そもそものデータが呼ばれていないのかなと思い、都道府県の値である「$data->pref」をそのままecho出力したのですが、想定通り["1","3","5"]が表示されました。これをコピペしてセレクト要素の第三引数(初期値)に直接記述すると、正しく反映されます。

{{Form::select('pref[]', config('pref'), ["1","3","5"], ['multiple' => 'multiple'])}}

イメージ説明
ところが、同じく第三引数に変数($data->pref)で記述すると、フォームに反映されません。この変数は配列として正しく認識されていないのでしょうか。(出力されたHTMLソースを見てもselectedがありません)

{{Form::select('pref[]', config('pref'), optional($data)->pref, ['multiple' => 'multiple'])}}

イメージ説明
基礎的なところで大変恐縮ですが、上記の問題について諸先輩方のご助言をいただけますと幸いです。
どうぞ、よろしくお願い申し上げます。

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

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

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

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

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

hayato7

2020/10/29 00:50

> $data->prefをそのままecho出力すると["1","3","5"]が表示され とありますが、文字列が出力されるということでしょうか?
KumaChan

2020/10/29 00:54

はい。そのまま文字列として出力されます。
guest

回答1

0

ベストアンサー

うまく動作しない時の状態

php

1{{Form::select('pref[]', config('pref'), '["1","3","5"]', ['multiple' => 'multiple'])}}

うまく動作する時の状態

php

1{{Form::select('pref[]', config('pref'), ["1","3","5"], ['multiple' => 'multiple'])}}

上記のように、第三引数に配列で渡しているかどうかが問題のように思います。

$data->pref:配列をテキスト型で保存(値:["1","3","5"])

とありますので、そもそものデータの保存方法があまりよろしくありません。(配列を一つのカラムで保存すると、使いづらいため。せめてカンマ区切りなどで保存し、explodeですぐに配列にできるのがいいかと思います。)

とにかく動かしてみたいのであれば、viewでもcontroller側でもいいですが、以下のような処理を挟んで、$returnを第三引数に渡せば動くのではないかと思います。(動作の保証はできません。)

php

1$prefs = optional($data)->pref; 2preg_match_all('/"(.+?)"/', $prefs, $res,PREG_SET_ORDER); 3 4$return = []; 5foreach($res as $val) { 6 $return[] = $val[1]; 7}

投稿2020/10/29 01:54

hayato7

総合スコア1135

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

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

KumaChan

2020/10/29 02:09

やはり配列としてうまく認識されてなかったんですね。 カンマ区切りも想定したのですが、処理を簡略化したくて… とりあえず、ご提示の方法で要件を実現することができました。 丁寧な解説とサンプルまで出していただき、本当にありがとうございます。 Laravelは勉強中なので、またここで質問させていただくかもしれません。 それでは、今後ともよろしくお願い申し上げます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問