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

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

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

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

PHP

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

解決済

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

YO14
YO14

総合スコア0

Laravel

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

PHP

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

2回答

0評価

0クリップ

32閲覧

投稿2019/05/09 03:21

編集2022/01/12 10:58

実現したいこと

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

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

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

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

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

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

現状

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

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

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

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

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

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

PHP

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

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

PHP

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

ソースコード(ArticleRequest.php)

PHP

/** * Get the validation rules that apply to the request. * * @return array */ public function rules() { return [ 'name' => 'required' ]; } }

#テーブル定義

SQL

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文

PHP

$info = 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($info);

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

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

(5/12追記)
こちら、現状まだ解決できておりません。自分で、条件分岐を整理してみたのですが、

①もしPOSTされてきた値が"WEB"だったら、checkedを印字する
②もしエラーが発生したとき
-直前の値がWEBだったら(直前の値が存在したら)、checked
-直前の値が空だったら、チェックは入らない(POSTされてきた値がWEBであった場合、値を空で上書き)
③もしエラーが発生しておらず、
-直前の値がWEBだったら(直前の値が存在したら)、checked
-直前の値が空だったら、checkedを出さない

と、ifが大量かつifの中にifが入れ子になるような分岐になってしまい、上手く記述できません。
また、お二人の方から回答をいただいておりますが、判定にarrayを使うような書き方をされており、私の手元のコードにどう反映すればよいか分かりません。
元々配列の中の値としてPOSTされてきているものを更に配列に入れる…???と新たな疑問が出てきてしまい、先へ進めなくなってしまいました。
引き続き、どなたかもう少しかみ砕いたご回答をいただけると大変有難く存じます。よろしくお願いいたします。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

m.ts10806
m.ts10806

2019/05/09 03:26

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

2019/05/09 03:36

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

2019/05/09 03:41

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

2019/05/09 03:54

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

2019/05/09 04:00

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

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

Laravel

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

PHP

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