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

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

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

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

PHP

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

Q&A

解決済

2回答

1280閲覧

Laravel Validateを使用したCRUDでの、UPDATE時のチェックボックスの値を保持する方法

YO14

総合スコア45

Laravel

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

PHP

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

0グッド

0クリップ

投稿2019/05/09 03:21

編集2019/05/15 09:15

実現したいこと

(事前)Controllerで use App\Http\Requests\Article\ArticleRequest;
(事前)ArticleRequestに、public function rulesで、name|required のバリデーションルール設定

既存のデータ(例えば名前=鈴木、年齢=45、趣味=チェックボックス群の中から、カメラを選択)をUPDATEするための各項目編集画面を表示する

・名前を空欄にする
・趣味のチェックボックス群において、カメラのチェックを外し、温泉旅行にチェックを入れる

入力内容確認ボタンを押下(正常な動作なら、入力内容確認画面に遷移)

名前が空欄なので、バリデーションエラーメッセージが表示された編集画面が表示される

その際、趣味のチェックボックス群では、温泉旅行にチェックが入っている状態にしたい(元々のカメラのチェックは外れた状態にしたい)

現状

既存のデータ(例えば名前=鈴木、年齢=45、趣味=チェックボックス群の中から、カメラを選択)をUPDATEするための各項目編集画面を表示する

・名前を空欄にする
・趣味のチェックボックス群において、カメラのチェックを外し、温泉旅行にチェックを入れる

入力内容確認ボタンを押下(正常な動作なら、入力内容確認画面に遷移)

名前が空欄なので、バリデーションエラーメッセージが表示された編集画面が表示される

その際、趣味のチェックボックス群では、カメラにチェックが入っている。温泉旅行のチェックは外れている

ソースコード(edit.blade.php)

PHP

1<div class="form-group @if(!empty($errors->first('media1'))) has->error @endif"> 2 <label> 3 <input type="hidden" name="media1" value=""> <!--チェックボックスが非選択だった時、valueを空で送るための記述 --> 4 @if(empty($errors->first('media1'))) <!-- チェックボックスに関するエラーがない場合--> 5 <input type="checkbox" name="media1" value="{{$info['media1']}}" @if($info['media1']== "WEB") checked @endif>WEB <!--DBの値がvalueに入る。更にその内容次第で、チェックボックスを選択済みに --> 6 @else <!-- エラーが発生したとき--> 7 <input type="checkbox" name="media1" value="{{Request::old('media1')}}" @if(Request::old('media1') == "WEB") checked @endif> <!-- エラー直前にこのチェックボックスが選択されていたら、選択済みを保持--> 8 @endif 9 </label> 10 <span class="help-block">{{$errors->first('media1')}}</span> 11</div> 12<div class="form-group @if(!empty($errors->first('media2'))) has->error @endif"> 13 <label> 14 <input type="hidden" name="media2" value=""> <!--チェックボックスが非選択だった時、valueを空で送るための記述--> 15 @if(empty($errors->first('media2'))) 16 <input type="checkbox" name="media2" value="{{$info['media2']}}" @if($info['media2']== "TV" ) checked @endif>TV <!--DBの値がvalueに入る。更にその内容次第で、チェックボックスを選択済みに --> 17 @else <!-- エラーが発生したとき--> 18 <input type="checkbox" name="media2" value="{{Request::old('media2')}}" @if(Request::old('media2') == "TV") checked @endif> <!-- エラー直前にこのチェックボックスが選択されていたら、選択済みを保持--> 19 @endif 20 </label> 21 <span class="help-block">{{$errors->first('media2')}}</span> 22</div>

#ソースコード(ArticlesController.php)

PHP

1/** 2 * Display a listing of the resource. 3 * 4 * @return \Illuminate\Http\Response 5 */ 6 public function send_data($id) //編集画面にデータを送る 7 { 8 $info = Article::find($id); 9 return view('article/edit', ['info' => $info]); 10 } 11 12

ソースコード(ArticleRequest.php)

PHP

1/** 2 * Get the validation rules that apply to the request. 3 * 4 * @return array 5 */ 6 public function rules() 7 { 8 return [ 9 'name' => 'required' 10 ]; 11 } 12}

#テーブル定義

SQL

1CREATE TABLE articles ( 2id int(10) unsigned NOT NULL AUTO_INCREMENT, 3name varchar(255) NOT NULL, 4email varchar(255) NOT NULL, 5age int(11) unsigned, 6area varchar(255) NOT NULL, 7gender int(2) unsigned, 8media1 varchar(255), 9media2 varchar(255), 10note varchar(255) NOT NULL, 11image varchar(255) NOT NULL, 12created_at timestamp NOT NULL default 13current_timestamp, 14updated_at timestamp NOT NULL default 15current_timestamp 16on update current_timestamp, 17primary key(id)) ENGINE=InnoDB CHARSET=utf8;

insert文

PHP

1$info = array( 2 'name' => $request->name, 3 'email' => $request->email, 4 'age' => $request->age, 5 'area' => $request->area, 6 'gender' => $request->gender, 7 'media1' => $request->media1, 8 'media2' => $request->media2, 9 'note' => $request->note, 10 'image' => $request->image, 11 ); 12 Article::insert($info);

DBの値の表示が優先されているようで、どのように記述すればoldの値がvalueに入れられるか分かりません。
また、上記ソースコードだと、
・名前、年齢を正しく入力
・温泉旅行にもチェック(カメラと温泉旅行両方にチェックが付いた状態)
して編集実行しても、温泉旅行がnullになってしまいます。

Laravelにお詳しい方、お知恵をお貸しいただけると有難く存じます。よろしくお願いいたします。

(5/15追記)
以下のように書き換えることで、
・エラーが無く、テーブルの値を参照した際、値が"WEB"であった場合には、チェックボックスはchecked
または
・他の項目でエラーが発生した際、チェックボックスにチェックを入れていた場合(=直前の値が"WEB"であった場合)、チェックボックスはchecked
とすることができました。

ソースコード(edit.blade.php)

PHP

1<label> 2 <input type="checkbox" name="media1" value="WEB" {{(!$errors->has('*') && $info['media1']== "WEB") || old('media1') == "WEB" ? 'checked' : ''}} >WEB <!--DBの値がvalueに入る。更にその内容次第で、チェックボックスを選択済みに --> 3 </label>

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

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

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

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

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

m.ts10806

2019/05/09 03:26

viewだけでなくバリデーションを行っているところのコード、コントローラーのコードもご提示いただければと。 念のため、DBのテーブル定義とサンプルデータもあったほうがいいかもしれません。
YO14

2019/05/09 03:36

質問文に追記いたしました。 テーブル定義は、 name=varchar(255) age=int(11) media1=varchar(255) NULLを許容 media2=varchar(255) NULLを許容 です。 サンプルデータとは、どのようなものでしょうか。
m.ts10806

2019/05/09 03:41

CREATE TABLE文(テーブル定義) INSERT文(サンプルデータ) です。 実際のデータによって判断しているのでしたら 例えば$infoに何が入っているのかが分かっていたほうがより具体的な回答につながりやすくなります。
YO14

2019/05/09 03:48

CREATE文は、以下です。 CREATE TABLE articles ( id int(10) unsigned NOT NULL AUTO_INCREMENT, name varchar(255) NOT NULL, email varchar(255) NOT NULL, age int(11) unsigned, area varchar(255) NOT NULL, gender int(2) unsigned, media1 varchar(255), media2 varchar(255), note varchar(255) NOT NULL, image varchar(255) NOT NULL, created_at timestamp NOT NULL default current_timestamp, updated_at timestamp NOT NULL default current_timestamp on update current_timestamp, primary key(id)) ENGINE=InnoDB CHARSET=utf8; INSERT文は、Laravelの::insert($~~~);によって実行されていますが、 以下が詳細です。$dataが、$infoであるとお考えください。 $data = array( 'name' => $request->name, 'email' => $request->email, 'age' => $request->age, 'area' => $request->area, 'gender' => $request->gender, 'media1' => $request->media1, 'media2' => $request->media2, 'note' => $request->note, 'image' => $request->image, ); Article::insert($data);
m.ts10806

2019/05/09 03:54

質問本文に追記願います。 コメント欄ではマークダウンが使えませんし、デフォルトは非表示ですので
YO14

2019/05/09 04:00

追記いたしました。 $infoには、DBからidで紐づけて取得した各種データが格納されています。(名前、性別等…)
guest

回答2

0

ベストアンサー

そもそも、チェックボックスの使い方の認識?が間違っているのかな、と思いました。

チェックボックスのvalue、ラジオボタンのvalue、プルダウンのoptionのvalue、
これらは「システム側で決められた値」であることが通常です。

つまり、テキストボックスと違い、valueそのものに登録or入力されたデータ値を参照する必要はなく、「選択済みにするかしないか」の点で、登録or入力されたデータ値を参照します。

また、選択済みにするかしないかの参照先判定(登録データをみるか、入力値を見るか)は、
「エラーがなければ、登録データをみて」あるいは「入力値をみて」くらいでいいのかなと思われます。

それから、$errosはインスタンス自体はいつでも存在する為、エラーの全体の有無をempty($errors)では正しく判定できないので、!$errors->has('*')で、「何もエラーを持っていない」と判定します。

これら3点を踏まえて、簡単にまとめるとこんな感じになります。

例:WEBのチェックボックス

php

1<input type="checkbox" name="media1" value="WEB" {{(!$errors->has('*') && $info['media1']== "WEB") || (old('media1') ?? '')== "WEB" ? 'checked':'' }} >WEB

※登録フローに「確認画面」が存在し、確認画面から入力画面へ戻れる仕様の場合、もう少し工夫が必要だと思うので、あくまでご参考までに。

投稿2019/05/09 07:16

編集2019/05/10 02:17
mix-peach

総合スコア1910

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

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

YO14

2019/05/12 13:36

ご回答ありがとうございます。 いただいたコードの条件分岐の箇所ですが、 (old('media1') ?? '')== "WEB" の箇所が、どういう処理をしているのか分かりません、教えていただけませんでしょうか。 ①エラーが発生しておらず、かつ前のページからPOSTされた$info['media1']の中身が"WEB"である または ②エラー発生直前に入力された値であるold('media1')が??NULLではなく??かつ、"WEB"のとき、'checked'が表示される
mix-peach

2019/05/13 06:27 編集

?? は、isset判定の簡易記述みたいなやつです。。。見慣れた感じに書きかえると、 if (isset(old('media1'))) { old('media1') } else { '' } こんな感じのことしてます。 入力欄の初期値とかに使うと便利なのですが、これはなくても問題有りません。(つい癖で書いてしまった。。) 「 ?? ’’ 」の部分が、あってもなくても ①エラーが発生しておらず、登録データ($info)のmedia1の中身が"WEB"である または、 ②直前に入力された値が、"WEB"である のいずれかで、’checked’ ってことになるので、回答に書いた判定内容以上のことはしていないです。
YO14

2019/05/15 09:10

<label> <input type="checkbox" name="media1" value="WEB" {{(!$errors->has('*') && $info['media1']== "WEB") || old('media1') == "WEB" ? 'checked' : ''}} >WEB </label> とすることで、初期値がWEBである場合、またはエラー直前の値がWEBであった場合、checkedとすることができました。 ありがとうございます。
guest

0

<input type="checkbox" name="media[]" value="1" @if(is_array(old('media')) && in_array(1, old('media'))) checked @endif> WEB <input type="checkbox" name="media[]" value="2" @if(is_array(old('media')) && in_array(2, old('media'))) checked @endif> TV <input type="checkbox" name="media[]" value="3" @if(is_array(old('media')) && in_array(3, old('media'))) checked @endif> GAME
<input type="checkbox" name="media1" value="1" @if(null !== old('media1')) checked @endif> WEB <input type="checkbox" name="media2" value="2" @if(null !== old('media2')) checked @endif> TV <input type="checkbox" name="media3" value="3" @if(null !== old('media1')) checked @endif> GAME

気になったので調べて見ましたけど、結構記事落ちてましたよ。

今回のアンサーの方法
https://stackoverflow.com/questions/39521726/how-to-show-old-data-of-checkbox-in-laravel

ヘルパーを作る方法
https://qiita.com/namizatop/items/fab4f78438d3d1940acd

投稿2019/05/09 06:06

編集2019/05/09 06:30
zushi0905

総合スコア683

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

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

YO14

2019/05/12 14:40

ご回答ありがとうございます。ググり力不足で申し訳ございません。 ご提示いただいた記事を拝見しましたが、stackoverflowの方は、チェックボックスの値を配列形式にしているのか、私のやり方と違ったためそちらの疑問が湧いてしまい、上手く落とし込めていません。 また、2番目に記述いただいている3行のコードですが、 「もしold('media1')がNULLでなかったら、checkedにする」という理解で宜しいでしょうか。 その場合ですと、その判定の前に 「エラーが発生しているか、していないか」 「POSTされてきた値が存在するか、しないか」 を書かなくてはいけないと思っているのですが、上手く書けずにいます。if文の中にif文を書くのが苦手でして…。 「こう書けばいいのでは?」といったアドバイスをいただけると有難く存じます。
zushi0905

2019/05/13 17:09 編集

始めに私はバージョン5.5を扱っています。ご考慮ください。 old('media') は直前の入力値を参照します。mediaのvalueの値がNULLであるかないかを判定しています。 処理順に関しては問題ないと思います。何故checkboxのvalueをoldヘルパーやデータベースから取得しているかという点は疑問です。 mediaの名前が変わるなら、$info['media1']== "WEB"がエラーの原因となります。判定条件を存在の有無にしたほうがいいと思います。その場合はvalueの値は何でも大丈夫です。 mediaの名前が変わらないなら、valueの値はどう転んでも同じです。media1なら'WEB'と固定してしまうのもいいでしょう。 重要なのはcheckedを付けるか付けないかです。 $errorが常に存在していることをもうお一方の回答ではじめて知りました笑 まずはemptyメソッド消すところをやってみてはいかがでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問