過去の質問
日時と場所を指定する利用登録に関するテーブル定義とリレーションについて
Laravelにおいて外部キーを主キーとしているテーブルとで適切なリレーションができているかわからない。
Laravel歴1ヶ月弱です。
認証と基本のCRUDを学習してきて、現在、就活に向けて成果物を作るにあたって施設などの利用申請(予約申請)のシステムを簡単にしたものを制作しています。
これまでテーブルに関しては上記のような質問をさせていただきここまで進めてきています。
環境
Laravel 6.5.0
Homestead
質問したいこと
flatpickrなどのカレンダーライブラリを用いて、下記のアクティビティ図のような処理を想定した処理を書いているのですが、時間帯選択のフォームは最初表示されていない状態で施設名と日付をサーバーに送信したあとにアクティビティ図のような処理を適用したあとで、時間帯選択のフォームをフェードインのようなアニメーションで表示させたいと思い、Ajaxを使った処理を書いていたのですがJavascriptに慣れていないので、PHP側から帰ってきた後の処理を考えていたところ詰まってしまったため今回質問させていただきました。
具体的には他のユーザーがその日の施設の予約を取る際に、別のユーザーがすでに同日・同施設に予約を入れている場合、その時間帯を選択できないようにしたいので、取得してきた各予約情報の中から利用開始時間と利用終了時間を参照して、それを元に例えばflatpickrなら下記のminTimeやmaxTimeに設定する値を求めたいがその書き方がわからないといったといころです。
Javascript
1const config = { 2 enableTime: true, 3// フォームで選択できる時間の範囲を以下の通りにする 4 minTime: "16:00", 5 maxTime: "22:00" 6} 7flatpickr('.flatpickr', config);
処理がまだ定まってないのでまだviewを作っていないのですが
flatpickrなどのカレンダー・時刻選択のライブラリを使用したものを含めて
・施設名選択
・日付選択
(ここで一旦送信ボタンを押させてAjaxを発火させ、以下の2つのinputタグを表示するようにする)
・利用開始時間選択
・利用終了時間選択
(ここで送信ボタンを押させて、以下の通りで予約を確定しますか? というページへリダイレクトさせる)
と4つのinputタグを用意して、製作する予定です。
プログラミング歴も浅く、初めての製作なので、そもそもコードとかに間違いがあったり、処理的に問題がある場合は遠慮なく指摘していただけると助かります。
そのため、リーダブルとは言えないことを承知の上で、かなりコメントアウトを残したままのコードになっています。
質問に際してやったこと・作ったもの
ER図
JS側で書いているところ(途中)
Javascript
1// 利用する日付と施設名を選択して、submitボタンをonclickすると、ajax発火 2 3$(document).on("click", ".date-select", function() { 4 init_set_reservations(); 5 6 7}); 8 9 10// 1で発火したajaxでデータベースにアクセスして、テーブルから取得した日付の予約情報を取り出す。 11 12function init_set_reservations () { 13 14 const server_url = "http://localhost:8000/"; // 使用しているサーバーのURLを定義 15 16 17 // ajax通信、GETでフォームのデータを送信して、PHP側でデータベースからデータを取得するときの検索キーワードにする。 18 $.ajax({ 19 type:"GET", 20 url: server_url + "get-reservation.php"; 21 datatype:'json', 22 data:{ 23 date:$('#dateinfo').val(), // 日付選択のためのinputタグからの情報 24 facility_name:$('#facility_name').val() // 施設名選択のためのinputタグからの情報 25 26 } 27 }).done(function(data) { 28 29 30 /* 31 受け取った情報を元にminTimeとmaxtimeを算出する。 32 その後、フェードインで時間帯選択フォームを表示させる。(クラス切り替えでcssを切り替える) 33 時間の範囲はmintimeとmaxtime。 34 */ 35 36 // JSONをパースする(JSオブジェクトに変換) 37 38 let obj = {}; 39 let obj = Json.parse(data); 40 41 // JSオブジェクトを配列にして返し、さらにキーごとの配列を分ける。 42 let objlist = Object.entries(obj).map(([key, value]) => ({[key]: value})); 43 44 // 上記の配列からstart_timeとend_timeの値を取り出す。 45 46 let array_start_time = objlist.filter(function(value, start_time, thisArray) { 47 return array_start_time; 48 }); 49 50 let array_end_time = objlist.filter(function(value, end_time, thisArray) { 51 return array_start_time; 52 }); 53 54 /* 55 得られたstatt_timeを比較してminTimeを、end_timeでMaxTimeを算出したい。 56 57 */ 58 59 }).fail(function(jqXHR, textStatus, errorThrown ) { 60 $("#span1").text(jqXHR.status); 61 $("#span2").text(textStatus); 62 $("#span3").text(errorThrown); 63 64 }).always(function(){ 65 $("#span6").text("complete"); 66 67 }); 68} 69
php側の処理
php
1<?php 2 3// 試しに書いている状態なのでメソッド名などは仮置。modelとcontrollerに後で処理を分ける 4 5 6// Ajaxから送信されてきたデータは例としては下記のようになっていると想定 7 // $_GET['date'] = '2019-11-30'; 8 // $_GET['facility_name'] = '多目的室A'; 9 10 public function test(){ 11 12 if(isset($_GET['date']) && isset($_GET['facility_name'])) { 13 14 // セッションに保存されている情報を変数に代入。 15 16 $reservedates = $_GET['date']; 17 $facility_name = $_GET['facility_name']; 18 19 /*facility_nameからfacility_idを参照し、それを元に予約情報を抽出。さらに特定のカラムのレコードに絞ってそれを連想配列の形で取得する。 20 今回はstart_timeとend_timeを取得したい。 21 */ 22 23 $start_times = \App\Reserve::whereHas('Facility', function($query){ 24 $query->where('facility_name', $facility_name)->whereDate('start_time', $reservedates); 25 })->pluck('start_time','id'); 26 27 $end_times = \App\Reserve::whereHas('Facility', function($query){ 28 $query->where('facility_name', $facility_name)->whereDate('end_time', $reservedates); 29 })->pluck('end_time','id'); 30 31 /*しかし、上記のコードだとjson_encodeの際に困ったので、同じようにfacility_nameからfacility_idを参照し、それと指定された日時を元に予約情報を抽出。その中からid、start_time、end_timeのカラムの値をすべて取得し、配列にする。tinkerでのテストはこちらの関数を実行した。 32 where()系の第2引数は本番だと変数。 33 */ 34 35 $reserveinfo = \App\Reserve::whereHas('Facility', function($query){ 36 $query->where('facility_name', 'test1')->whereDate('start_time', '2019-11-30')->whereDate('end_time', '2019-11-30'); 37 })->select('id', 'start_time', 'end_time')->get()->all(); 38 39 /* 注釈 40 $array_reserveinfo = $reserveinfo->all(); // all()はCollectionのメソッドでクエリビルダとしてのget()とは違うので記述する場合はさらに別の変数にエスケープしたほうがいい? 41 42 */ 43 44 // 取得したデータを連想配列にしてJSONにしてAjaxに渡す(HTTPの処理なのでcontrollerに記述する) 45 46 $json = json_encode($reserveinfo, JSON_PRETTY_PRINT); 47 48 } else { 49 echo 'FAIL TO AJAX REQUEST'; 50 } 51 } 52}
PHPのコードをtinkerで試した結果
追記
view
HTML
1<body> 2<div id="app"> 3 <div clas="container"> 4 <div class="row justify-content-center"> 5 <div class="col-md-8"> 6 <div class="card"> 7 <div class='card-hearder'>{{ __('get-reservation' )}}</div> 8 9 <div class="card-body"> 10 <form method="GET" action="javascript:void(0);" id="test"> 11 <div class="form-group row"> 12 <label for="facility_name" class="col-md-4 col-form-label text-md-right">{{ __('facility_name' )}}</label> 13 14 <div class="col-md-6"> 15 <select class="form-control" id="facility_name" name="facility_name"> 16 <option value="blank" selected="selected">選択してください</option> 17 <option value="test1">test1</option> 18 <option value="test2">test2</option> 19 <option value="test3">test4</option> 20 </select> 21 22 </div> 23 </div> 24 25 <div class="form-group row"> 26 <label for="dates" class="col-md-4 col-form-label text-md-right">{{ __('dates' )}}</label> 27 28 <div class="col-md-6"> 29 <input type="text" class="form-control dateinfo" placeholder="Select Date.." id="dateinfo" name="dateinfo" readonly="readonly"> 30 31 </div> 32 </div> 33 34 <div class="form-group row"> 35 <div class="col-md-8 offset-md-4"> 36 <button type="submit" class="btn btn-primary" id="date-select"> 37 {{ __('submit') }} 38 </button> 39 40 </div> 41 </div> 42 </form> 43 </div> 44 </div> 45 </div> 46 </div> 47 </div> 48</div> 49 50<script> 51$(function () { 52 53$(document).on("click", "#date-select", function() { 54 init_set_reservations(); 55}); 56 57// 1で発火したajaxでデータベースにアクセスして、テーブルから取得した日付の予約情報を取り出す。 58 59function init_set_reservations () { 60 61 const server_url = "http://localhost:8000/"; // 使用しているサーバーのURLを定義 62 63 64 // フォームで送信されるデータの確認 65 var formData = $('#test').serialize(); 66 console.log(formData); 67 68 // Ajax。今回は非同期で行いたい。 69 70 $.ajax({ 71 type:'GET', 72 url: server_url + "/get-reserve", 73 datatype:'json', 74 data:{ 75 dateinfo:$('#dateinfo').val(), // 日付選択のためのinputタグからの情報 76 facility_name:$('#facility_name').val() // 施設名選択のためのinputタグからの情報 77 78 } 79 80 }).done(function(data) { 81 console.log(data); 82 }); 83} 84 flatpickr(".dateinfo"); 85 86 87 88 </script> 89 </body> 90</html>
ルーティング
php
1Route::get('get-reserve', 'ReserveController@test');
モデム側のメソッド
php
1static function SearchReserveDates() { 2 3 $reserveinfo = \App\Reserve::whereHas('Facility', function($query){ 4 $query->where('facility_name', "{$facility_name}")->whereDate('start_time', "{$reservedates}")->whereDate('end_time', "{$reservedates}"); 5 })->select('id', 'start_time', 'end_time')->get()->all();
コントローラー
php
1 public function test(){ 2 if(isset($_GET['dateinfo']) && isset($_GET['facility_name'])) { 3 4 $reservedates = $_GET['dateinfo']; 5 $facility_name = $_GET['facility_name']; 6 7 $reserveinfo = Reserve::SearchReserveDates();// モデムのメソッドをそのまま書いたものでも同様の結果になる 8 9 \Debugbar::info($reserveinfo); 10 11 $json = json_encode($reserveinfo, JSON_PRETTY_PRINT); 12 13 } else { 14 dd($reservedates); 15 dd($facility_name); 16 } 17}
回答1件
あなたの回答
tips
プレビュー