前提・実現したいこと
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/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
回答2件
あなたの回答
tips
プレビュー