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

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

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

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

PHP

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

Q&A

解決済

2回答

2799閲覧

Laravel 条件付きでチェックボックスの入力を強制したい

apprentice123

総合スコア2

Laravel

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

PHP

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

0グッド

0クリップ

投稿2021/05/15 06:56

編集2021/05/15 21:28

前提・実現したいこと

Laravel8で学習時間が0分でなければいずれかの学習科目のチェックが必要、というバリデーションを行いたいです。
しかし、学習時間0分を選択しても以下のエラーがでてしまいます。
どなたかご教示ください。よろしくお願いします。

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

学習時間が0以外の場合、科目を指定してください。

該当のソースコード

```Laravel <?php namespace App\Http\Controllers; use Illuminate\Http\Request; //RecordRequestを継承 use App\Http\Requests\RecordRequest; //RecordRequestを継承 use Illuminate\Support\Facades\DB; //DBを操作する場合に必要 use App\Http\Controllers\Record; class RecordController extends Controller { // public function index(){ $items = DB::select('select * from records'); $data = ['items'=>$items]; return view('record.index',$data); //連想配列$itemsのキーを「items」とする['items'=>$items] } public function post(){ $items = DB::select('select * from records'); $data = ['items'=>$items]; return view('record.index',$data); } public function add(Request $request){ return view('record.add'); } public function create(RecordRequest $request){ //フォームの送信内容を受け取るクラスに、RecordRequestが継承されるようにする // バリデーション済みデータの取得 $validated = $request->validated(); $str=implode(',',$request->subject); //implodeメソッドで配列を文字列に変換 $param=[ 'date'=>$request->date, 'sum'=>$request->sum, 'subject'=>$str, //「'subject'というキーを、$requestオブジェクトのsubjectプロパティに割り当てる」ということ? 'created_at'=>$request->created_at, ]; // DB::insert('insert into records (date, sum, subject, created_at) values(:date, :sum, :subject, :timestamps)', $param); DB::table('records')->insert($param); return redirect('http://localhost:8000/record'); } }

Laravel

1<!DOCTYPE html> 2<html lang="ja"> 3<head> 4 <meta charset="UTF-8"> 5 <meta http-equiv="X-UA-Compatible" content="IE=edge"> 6 <meta name="viewport" content="width=device-width, initial-scale=1.0"> 7 <title>hello_world</title> 8</head> 9 10<body> 11 12 13 14 15 16 <!-- Authentication --> 17 <form method="POST" action="{{ route('logout') }}"> 18 @csrf 19 20 <x-jet-dropdown-link href="{{ route('logout') }}" 21 onclick="event.preventDefault(); 22 this.closest('form').submit();"> 23 {{ __('Log Out') }} 24 </x-jet-dropdown-link> 25 </form> 26 27 {{date('Y年m月d日 h:i:s')}}; 28 29<h1>記録</h1> 30<h2>フォーム</h2> 31 32<h1>エラー</h1> 33@if ($errors->any()) 34 <div class="alert alert-danger"> 35 <ul> 36 @foreach ($errors->all() as $error) 37 <li>{{ $error }}</li> 38 @endforeach 39 </ul> 40 </div> 41@endif 42 43<form method="post" action="/record/add"> 44@csrf 45学習した日付</br> 46<input type="date" name="date" value="<?php echo date('Y-m-j');?>"> 47 48<p> 49学習時間</br> 50<select name="sum"> 51<option hidden="選択してください"></option> 52<option value="180">180分</option> 53<option value="150">150分</option> 54<option value="120">120分</option> 55<option value="90">90分</option> 56<option value="60">60分</option> 57<option value="30">30分</option> 58<option value="15">15分</option> 59<option value="0">0分</option> 60</select> 61</p> 62 63<p> 64学習した科目(複数可)</br> 65<input type="hidden" name="subject[]" value=""> 66<label> 67 <input type="checkbox" name="subject[]" value="国語">国語 68</label> 69<label> 70 <input type="checkbox" name="subject[]" value="英語">英語 71</label> 72<label> 73 <input type="checkbox" name="subject[]" value="数学">数学 74</label> 75</p> 76 77<p><input type="submit" value="送信"></p> 78 79</form> 80 81<table> 82<tr><th>date</th><th>sum</th><th>subject</th><th>created_at</th><th>updated_at</th></tr> 83@foreach ($items as $item) 84 <tr> 85 <td>{{$item->date}}</td> 86 <td>{{$item->sum}}</td> 87 <td>{{$item->subject}}</td> 88 <td>{{$item->created_at}}</td> 89 <td>{{$item->updated_at}}</td> 90 </tr> 91@endforeach 92 93</table> 94 95 96<!-- Postフォームの作成 97 98 99</body> 100 101</html>

Laravel

1<?php 2 3namespace App\Http\Requests; 4 5use Illuminate\Foundation\Http\FormRequest; 6 7class RecordRequest extends FormRequest 8{ 9 public function attributes() 10{ 11 return [ 12 'name' => '名称', 13 'sum' => '学習時間', 14 'subject[]' => '科目', 15 ]; 16} 17 18 19 20 /** 21 * Determine if the user is authorized to make this request. 22 * 23 * @return bool 24 */ 25 public function authorize() 26 { 27 return true; 28 } 29 30 /** 31 * Get the validation rules that apply to the request. 32 * 33 * @return array 34 */ 35 public function rules() 36 { 37 return [ 38 'date' => 'required', 39 'sum' => 'required', 40 'subject[]' => 'required_unless:sum,"0"', 41 ]; 42 } 43} 44 45

試したこと

①フォームリクエストの「'subject[]' => 'required_unless:sum,"0"',」を「'subject[]' => 'required',」に書き換えて試したところ、どのチェックボックスにチェックを入れてもエラーになりました。画面上ではチェックマークがついていてもチェックしたことになっていないように思います。しかし、データベースにはチェックした内容が問題なく登録されています。

追記
②フォームリクエストの「'subject[]' => 'required_unless:sum,"0"',」を「'subject' => 'required_unless:sum,"0"',」にした場合、学習科目のチェックに対するバリデーションは働きませんでした(学習科目が未入力のときにエラーがでません)

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

ここにより詳細な情報を記載してください。

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

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

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

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

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

gpsoft

2021/05/15 15:00

当てずっぽうですが、ルール記述の部分は、 'subject[]' => ... ではなく、 'subject' => ... と書くべきだったりしませんか?
gpsoft

2021/05/15 22:57

さらに当てずっぽうですが、 'required_unless:sum,0' と書くべきかもしれませんね(0をダブルクオートで囲まない)。
apprentice123

2021/05/16 13:25

ご回答ありがとうございます。 index.blade.phpの「<input type="hidden" name="subject[]" value="">」を削除したところ、「subject[]=...」を「subject=...」にすることで解決しました。 上記「<input type="hidden" name="subject[]" value="">」を削除した場合、学習時間0分の際に学習科目に何もチェックを入れない場合に「implode(): Argument #1 ($pieces) must be of type array, string given」が出てしまっているので、別途これを解決していこうと思います。 ご指摘ありがとうございました。
guest

回答2

0

if($request->subject !== null){
$str=implode(',',$request->subject); //implodeメソッドで配列を文字列に変換
} else {
$str = $request->subject;
}

ifを用いてチェックボックスがnullの場合のみimplode()を実行するようにすることで、「implode(): Argument #1 ($pieces) must be of type array, string given」のエラーも回避することができました。

投稿2021/05/17 12:28

apprentice123

総合スコア2

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

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

0

ベストアンサー

subject[]をubjectにしていいように見えるけれど。

バリデーション 8.x Laravel
にある、フォームリクエストバリデーションの下りを参考に、
バリデーションルールを書いた方が、
自前のif文判定よりも楽にエラーメッセージを返したりできるかと。

他の入力項目に従属する判定もさらっとかけますし。
物足りなければクロージャでさらっとルールを追加できます。

投稿2021/05/15 15:23

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

apprentice123

2021/05/16 13:25

ご回答ありがとうございます。 index.blade.phpの「<input type="hidden" name="subject[]" value="">」を削除したところ、「subject[]=...」を「subject=...」にすることで解決しました。 上記「<input type="hidden" name="subject[]" value="">」を削除した場合、学習時間0分の際に学習科目に何もチェックを入れない場合に「implode(): Argument #1 ($pieces) must be of type array, string given」が出てしまっているので、別途これを解決していこうと思います。 ご指摘ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問