質問編集履歴
5
コントローラーを調整
test
CHANGED
File without changes
|
test
CHANGED
@@ -236,7 +236,7 @@
|
|
236
236
|
|
237
237
|
|
238
238
|
|
239
|
-
#### Controller(自
|
239
|
+
#### Controller(自力で予約確定まで組んでみたものです)
|
240
240
|
|
241
241
|
```php
|
242
242
|
|
@@ -244,24 +244,6 @@
|
|
244
244
|
|
245
245
|
|
246
246
|
|
247
|
-
namespace App\Http\Controllers;
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
use App\Reserve;
|
252
|
-
|
253
|
-
use App\Exceptions\ReserveDuplicationException;
|
254
|
-
|
255
|
-
use App\Http\Requests\CreateReserveRequest;
|
256
|
-
|
257
|
-
use Carbon\Carbon;
|
258
|
-
|
259
|
-
use Illuminate\Http\Request;
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
247
|
class ReserveController extends Controller {
|
266
248
|
|
267
249
|
|
@@ -412,7 +394,7 @@
|
|
412
394
|
|
413
395
|
}
|
414
396
|
|
415
|
-
// try-catchで例外が出たら
|
397
|
+
// try-catchで例外が出たら入力フォームまでロールバックする。
|
416
398
|
|
417
399
|
|
418
400
|
|
@@ -444,7 +426,7 @@
|
|
444
426
|
|
445
427
|
|
446
428
|
|
447
|
-
// 入力確認ページのviewに
|
429
|
+
// 入力確認ページのviewにdataを渡す
|
448
430
|
|
449
431
|
return view('reserve-confirm', [
|
450
432
|
|
@@ -470,220 +452,244 @@
|
|
470
452
|
|
471
453
|
|
472
454
|
|
455
|
+
// 予約完了メールの発送
|
456
|
+
|
457
|
+
public function send(Request $request) {
|
458
|
+
|
459
|
+
|
460
|
+
|
461
|
+
//フォームから受け取ったactionの値を取得
|
462
|
+
|
463
|
+
$action = $request->input('action');
|
464
|
+
|
465
|
+
$inputs = $request->except('action');
|
466
|
+
|
467
|
+
|
468
|
+
|
469
|
+
//actionの値で分岐
|
470
|
+
|
471
|
+
if($action !== 'submit'){
|
472
|
+
|
473
|
+
return redirect()
|
474
|
+
|
475
|
+
->route('reserve.index')
|
476
|
+
|
477
|
+
->withInput($inputs);
|
478
|
+
|
479
|
+
|
480
|
+
|
481
|
+
} else {
|
482
|
+
|
483
|
+
$user = Auth::user();
|
484
|
+
|
485
|
+
$email = $user->email;
|
486
|
+
|
487
|
+
\Mail::to($email)->send(new ContactSendmail($inputs));
|
488
|
+
|
489
|
+
|
490
|
+
|
491
|
+
// トークンを再発行して再送信防止
|
492
|
+
|
493
|
+
|
494
|
+
|
495
|
+
$request->session()->regenerateToken();
|
496
|
+
|
497
|
+
|
498
|
+
|
499
|
+
}
|
500
|
+
|
501
|
+
|
502
|
+
|
503
|
+
}
|
504
|
+
|
505
|
+
|
506
|
+
|
507
|
+
|
508
|
+
|
509
|
+
// 予約確定による、データベースへの情報の追加
|
510
|
+
|
511
|
+
|
512
|
+
|
513
|
+
public function store(Request $request) {
|
514
|
+
|
515
|
+
|
516
|
+
|
517
|
+
// バリデーション
|
518
|
+
|
519
|
+
|
520
|
+
|
521
|
+
$request->validate([
|
522
|
+
|
523
|
+
'facility_name' => 'required',
|
524
|
+
|
525
|
+
'dateinfo' => 'required',
|
526
|
+
|
527
|
+
'start_time' => 'required',
|
528
|
+
|
529
|
+
'end_time' => 'required',
|
530
|
+
|
531
|
+
]);
|
532
|
+
|
533
|
+
|
534
|
+
|
535
|
+
|
536
|
+
|
537
|
+
// 再度ダブルブッキングのチェックを行う。
|
538
|
+
|
539
|
+
$this->confirm($request);
|
540
|
+
|
541
|
+
|
542
|
+
|
543
|
+
// 以下、ダブルブッキングなしの場合の更新処理
|
544
|
+
|
545
|
+
|
546
|
+
|
547
|
+
//フォームから受け取ったactionを除いたinputの値を取得
|
548
|
+
|
549
|
+
$inputs = $request->except('action');
|
550
|
+
|
551
|
+
|
552
|
+
|
553
|
+
// 検索用にfacility_nameをのみ別に変数に取り出しておく
|
554
|
+
|
555
|
+
|
556
|
+
|
557
|
+
$facility_name = $inputs['facility_name'];
|
558
|
+
|
559
|
+
|
560
|
+
|
561
|
+
// facility_idを抽出するメソッド
|
562
|
+
|
563
|
+
|
564
|
+
|
565
|
+
$facility_id = Facility::SearchFacility_id($facility_name);
|
566
|
+
|
567
|
+
|
568
|
+
|
569
|
+
|
570
|
+
|
571
|
+
// dateinfoとstart_time及びend_timeを組み合わせてdatetime型にする。
|
572
|
+
|
573
|
+
$start_time =$inputs['dateinfo'] .' '. $inputs['start_time'];
|
574
|
+
|
575
|
+
$end_time =$inputs['dateinfo'] .' '. $inputs['end_time'];
|
576
|
+
|
577
|
+
|
578
|
+
|
579
|
+
// 予約番号生成
|
580
|
+
|
581
|
+
|
582
|
+
|
583
|
+
$reserve_number = uniqid(bin2hex(random_bytes((1))));
|
584
|
+
|
585
|
+
|
586
|
+
|
587
|
+
// ユーザー情報取得
|
588
|
+
|
589
|
+
$user = Auth::user();
|
590
|
+
|
591
|
+
$user_id = $user->id;
|
592
|
+
|
593
|
+
|
594
|
+
|
595
|
+
// データベースに追加
|
596
|
+
|
597
|
+
$reserve = new Reserve();
|
598
|
+
|
599
|
+
$reserve->user_id = $user_id;
|
600
|
+
|
601
|
+
$reserve->facility_id = $facility_id;
|
602
|
+
|
603
|
+
$reserve->start_time = $start_time;
|
604
|
+
|
605
|
+
$reserve->end_time = $end_time;
|
606
|
+
|
607
|
+
$reserve->reserve_number = $reserve_number;
|
608
|
+
|
609
|
+
$reserve->save();
|
610
|
+
|
611
|
+
|
612
|
+
|
613
|
+
\Debugbar::info();
|
614
|
+
|
615
|
+
|
616
|
+
|
617
|
+
$this->send($request);
|
618
|
+
|
619
|
+
|
620
|
+
|
621
|
+
// viewへ遷移
|
622
|
+
|
623
|
+
return view('reserve-complete' ,[
|
624
|
+
|
625
|
+
'reserve_number' => $reserve_number,
|
626
|
+
|
627
|
+
]);
|
628
|
+
|
629
|
+
}
|
630
|
+
|
631
|
+
|
632
|
+
|
473
633
|
```
|
474
634
|
|
475
635
|
|
476
636
|
|
637
|
+
|
638
|
+
|
639
|
+
|
640
|
+
|
641
|
+
## 質問に際してやったこと・作ったもの
|
642
|
+
|
643
|
+
|
644
|
+
|
477
|
-
####
|
645
|
+
####console.log一覧
|
646
|
+
|
647
|
+
![イメージ説明](bf9d85eeb4899a2eb321994921a1f7d8.png)
|
648
|
+
|
649
|
+
|
650
|
+
|
651
|
+
####定義しているテーブル
|
652
|
+
|
653
|
+
![イメージ説明](3ea1e3d5e942984d320f517afee539f5.png)
|
654
|
+
|
655
|
+
|
656
|
+
|
657
|
+
## 追記
|
658
|
+
|
659
|
+
|
660
|
+
|
661
|
+
####Handler.php
|
662
|
+
|
663
|
+
|
478
664
|
|
479
665
|
```php
|
480
666
|
|
481
667
|
|
482
668
|
|
483
|
-
|
484
|
-
|
485
|
-
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
|
508
|
-
|
509
|
-
</div>
|
510
|
-
|
511
|
-
</div>
|
512
|
-
|
513
|
-
|
514
|
-
|
515
|
-
<div class="form-group row">
|
516
|
-
|
517
|
-
<label for="dates" class="col-md-4 col-form-label text-md-right">{{ __('dates' )}}</label>
|
518
|
-
|
519
|
-
|
520
|
-
|
521
|
-
<div class="col-md-6">
|
522
|
-
|
523
|
-
<input type="text" class="form-control dateinfo" placeholder="Select Date.." id="dateinfo" name="dateinfo" readonly="readonly">
|
524
|
-
|
525
|
-
|
526
|
-
|
527
|
-
</div>
|
528
|
-
|
529
|
-
</div>
|
530
|
-
|
531
|
-
|
532
|
-
|
533
|
-
<div class="form-group row">
|
534
|
-
|
535
|
-
<div class="col-md-8 offset-md-4">
|
536
|
-
|
537
|
-
<button type="submit" class="btn btn-primary" data-action='javascript:void(0);' id="date-select">
|
538
|
-
|
539
|
-
{{ __('submit') }}
|
540
|
-
|
541
|
-
</button>
|
542
|
-
|
543
|
-
|
544
|
-
|
545
|
-
</div>
|
546
|
-
|
547
|
-
</div>
|
548
|
-
|
549
|
-
|
550
|
-
|
551
|
-
<div class="form-group row js-timeselectform" >
|
552
|
-
|
553
|
-
<label for="start_time" class="col-md-4 col-form-label text-md-right">{{ __('start_time' )}}</label>
|
554
|
-
|
555
|
-
|
556
|
-
|
557
|
-
<div class="col-md-6">
|
558
|
-
|
559
|
-
<input type="text" class="form-control time" placeholder="Select Time.." id="start_time" name="start_time" readonly="readonly">
|
560
|
-
|
561
|
-
|
562
|
-
|
563
|
-
</div>
|
564
|
-
|
565
|
-
</div>
|
566
|
-
|
567
|
-
|
568
|
-
|
569
|
-
<div class="form-group row js-timeselectform">
|
570
|
-
|
571
|
-
<label for="end_time" class="col-md-4 col-form-label text-md-right">{{ __('end_time' )}}</label>
|
572
|
-
|
573
|
-
|
574
|
-
|
575
|
-
<div class="col-md-6">
|
576
|
-
|
577
|
-
<input type="text" class="form-control time" placeholder="Select Time.." id="end_time" name="end_time" readonly="readonly">
|
578
|
-
|
579
|
-
|
580
|
-
|
581
|
-
</div>
|
582
|
-
|
583
|
-
</div>
|
584
|
-
|
585
|
-
|
586
|
-
|
587
|
-
<div class="form-group row js-timeselectform">
|
588
|
-
|
589
|
-
<div class="col-md-8 offset-md-4">
|
590
|
-
|
591
|
-
<button type="submit" class="btn btn-primary" data-action="{{ route('reserve.confirm') }}" id="reserve-settle">
|
592
|
-
|
593
|
-
{{ __('reserve-settle') }}
|
594
|
-
|
595
|
-
</button>
|
596
|
-
|
597
|
-
</div>
|
598
|
-
|
599
|
-
</div>
|
600
|
-
|
601
|
-
</form>
|
602
|
-
|
603
|
-
</div>
|
604
|
-
|
605
|
-
</div>
|
606
|
-
|
607
|
-
<!-- 予約時間重複によるエラーメッセージ表示。仮置してます。 -->
|
608
|
-
|
609
|
-
@if ($errors->any())
|
610
|
-
|
611
|
-
<ul id = "error" class="error">
|
612
|
-
|
613
|
-
@foreach ($errors->all() as $error)
|
614
|
-
|
615
|
-
|
616
|
-
|
617
|
-
<li>{{ $error }}</li>
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
@endforeach
|
622
|
-
|
623
|
-
</ul>
|
624
|
-
|
625
|
-
@endif
|
626
|
-
|
627
|
-
|
628
|
-
|
629
|
-
(後略)
|
669
|
+
public function prepareResponse($request, Exception $e) {
|
670
|
+
|
671
|
+
// 競合違反を条件分岐
|
672
|
+
|
673
|
+
if($e instanceof ConflictHttpException) {
|
674
|
+
|
675
|
+
return $this->invaildHttpRequest($request, $e);
|
676
|
+
|
677
|
+
}
|
678
|
+
|
679
|
+
// 予約時間が競合していた場合エラーハンドリング
|
680
|
+
|
681
|
+
if($e instanceof ReserveDuplicationException) {
|
682
|
+
|
683
|
+
return redirect()->back()->withInput()->withErrors('その時間帯はすでに予約が入っています');
|
684
|
+
|
685
|
+
}
|
686
|
+
|
687
|
+
|
688
|
+
|
689
|
+
return parent::prepareResponse($request, $e);
|
690
|
+
|
691
|
+
}
|
692
|
+
|
693
|
+
|
630
694
|
|
631
695
|
```
|
632
|
-
|
633
|
-
|
634
|
-
|
635
|
-
## 質問に際してやったこと・作ったもの
|
636
|
-
|
637
|
-
|
638
|
-
|
639
|
-
####console.log一覧
|
640
|
-
|
641
|
-
![イメージ説明](bf9d85eeb4899a2eb321994921a1f7d8.png)
|
642
|
-
|
643
|
-
|
644
|
-
|
645
|
-
####定義しているテーブル
|
646
|
-
|
647
|
-
![イメージ説明](3ea1e3d5e942984d320f517afee539f5.png)
|
648
|
-
|
649
|
-
|
650
|
-
|
651
|
-
## 追記
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
####Handler.php
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
```php
|
660
|
-
|
661
|
-
|
662
|
-
|
663
|
-
public function prepareResponse($request, Exception $e) {
|
664
|
-
|
665
|
-
// 競合違反を条件分岐
|
666
|
-
|
667
|
-
if($e instanceof ConflictHttpException) {
|
668
|
-
|
669
|
-
return $this->invaildHttpRequest($request, $e);
|
670
|
-
|
671
|
-
}
|
672
|
-
|
673
|
-
// 予約時間が競合していた場合エラーハンドリング
|
674
|
-
|
675
|
-
if($e instanceof ReserveDuplicationException) {
|
676
|
-
|
677
|
-
return redirect()->back()->withInput()->withErrors('その時間帯はすでに予約が入っています');
|
678
|
-
|
679
|
-
}
|
680
|
-
|
681
|
-
|
682
|
-
|
683
|
-
return parent::prepareResponse($request, $e);
|
684
|
-
|
685
|
-
}
|
686
|
-
|
687
|
-
|
688
|
-
|
689
|
-
```
|
4
ControllerとViewの更新とHandler.phpの追記
test
CHANGED
File without changes
|
test
CHANGED
@@ -44,11 +44,15 @@
|
|
44
44
|
|
45
45
|
このようなコードを書いて冒頭の画像の利用開始時刻と、利用終了時刻の選択内容をバインドしています。
|
46
46
|
|
47
|
-
ですが、
|
47
|
+
ですが、例えばこの場合利用開始に14:00、利用終了に18:00を選択して14:00~18:00の時間帯を予約したいというリクエストができてしまいます。
|
48
48
|
|
49
49
|
当然それでは前述の前提条件とバッティングしてしまうのでその場合、確認画面に遷移せずフォームにリダイレクトしてエラーメッセージを表示させたいのですがこの場合バリデーションでやるのか自分で独自例外を作成してtry-catchでその例外に投げるのかどちらにするのかがわからないのでお聞きしたいです。
|
50
50
|
|
51
|
+
|
52
|
+
|
53
|
+
2020/01/10
|
54
|
+
|
51
|
-
|
55
|
+
コメント欄でご指摘いただいた箇所を修正、かつ自分なりにエラーハンドリングをしてみたのでControllerにそれを反映。
|
52
56
|
|
53
57
|
|
54
58
|
|
@@ -98,7 +102,7 @@
|
|
98
102
|
|
99
103
|
#### バリデーション
|
100
104
|
|
101
|
-
とりあえず基本的なところだけ
|
105
|
+
とりあえず基本的なところだけ。rulesメソッドのみ抜粋。
|
102
106
|
|
103
107
|
|
104
108
|
|
@@ -122,53 +126,181 @@
|
|
122
126
|
|
123
127
|
{
|
124
128
|
|
125
|
-
|
129
|
+
|
126
|
-
|
127
|
-
|
130
|
+
|
128
|
-
|
129
|
-
*
|
130
|
-
|
131
|
-
* @return bool
|
132
|
-
|
133
|
-
*/
|
134
|
-
|
135
|
-
public function
|
131
|
+
public function rules()
|
136
|
-
|
137
|
-
|
138
|
-
|
132
|
+
|
139
|
-
|
133
|
+
{
|
140
|
-
|
134
|
+
|
141
|
-
return
|
135
|
+
return [
|
136
|
+
|
137
|
+
'facility_name' => 'not_in:0',
|
138
|
+
|
139
|
+
'dateinfo' => 'required|date',
|
140
|
+
|
141
|
+
'start_time' => 'required|date_format:H:i',
|
142
|
+
|
143
|
+
'end_time' => 'required|date_format:H:i',
|
144
|
+
|
145
|
+
];
|
142
146
|
|
143
147
|
}
|
144
148
|
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
165
|
-
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
149
|
+
}
|
150
|
+
|
151
|
+
|
152
|
+
|
153
|
+
|
154
|
+
|
155
|
+
```
|
156
|
+
|
157
|
+
|
158
|
+
|
159
|
+
#### model
|
160
|
+
|
161
|
+
```php
|
162
|
+
|
163
|
+
<?php
|
164
|
+
|
165
|
+
|
166
|
+
|
167
|
+
namespace App;
|
168
|
+
|
169
|
+
|
170
|
+
|
171
|
+
use Illuminate\Database\Eloquent\Model;
|
172
|
+
|
173
|
+
|
174
|
+
|
175
|
+
class Reserve extends Model {
|
176
|
+
|
177
|
+
public $incrementing = false;
|
178
|
+
|
179
|
+
|
180
|
+
|
181
|
+
protected $fillable = [
|
182
|
+
|
183
|
+
'user_id',
|
184
|
+
|
185
|
+
'facility_id',
|
186
|
+
|
187
|
+
'start_time',
|
188
|
+
|
189
|
+
'end_time',
|
190
|
+
|
191
|
+
|
192
|
+
|
193
|
+
];
|
194
|
+
|
195
|
+
|
196
|
+
|
197
|
+
public function user() {
|
198
|
+
|
199
|
+
return $this->belongsTo('App\User');
|
200
|
+
|
201
|
+
}
|
202
|
+
|
203
|
+
|
204
|
+
|
205
|
+
public function facility() {
|
206
|
+
|
207
|
+
return $this->belongsTo('App\Facility');
|
208
|
+
|
209
|
+
}
|
210
|
+
|
211
|
+
|
212
|
+
|
213
|
+
static function SearchReserveDates($facility_name, $dateinfo) {
|
214
|
+
|
215
|
+
|
216
|
+
|
217
|
+
$result = \App\Reserve::whereHas('Facility', function($query) use($facility_name, $dateinfo) {
|
218
|
+
|
219
|
+
$query
|
220
|
+
|
221
|
+
->where('facility_name',$facility_name)
|
222
|
+
|
223
|
+
->whereDate('start_time',$dateinfo)
|
224
|
+
|
225
|
+
->whereDate('end_time',$dateinfo);
|
226
|
+
|
227
|
+
})->select('id', 'start_time', 'end_time')->get()->all();
|
228
|
+
|
229
|
+
return $result;
|
230
|
+
|
231
|
+
}
|
232
|
+
|
233
|
+
}
|
234
|
+
|
235
|
+
```
|
236
|
+
|
237
|
+
|
238
|
+
|
239
|
+
#### Controller(自分でtry-catchを組んでみました、全体としては未完成なので抜粋してます)
|
240
|
+
|
241
|
+
```php
|
242
|
+
|
243
|
+
<?php
|
244
|
+
|
245
|
+
|
246
|
+
|
247
|
+
namespace App\Http\Controllers;
|
248
|
+
|
249
|
+
|
250
|
+
|
251
|
+
use App\Reserve;
|
252
|
+
|
253
|
+
use App\Exceptions\ReserveDuplicationException;
|
254
|
+
|
255
|
+
use App\Http\Requests\CreateReserveRequest;
|
256
|
+
|
257
|
+
use Carbon\Carbon;
|
258
|
+
|
259
|
+
use Illuminate\Http\Request;
|
260
|
+
|
261
|
+
|
262
|
+
|
263
|
+
|
264
|
+
|
265
|
+
class ReserveController extends Controller {
|
266
|
+
|
267
|
+
|
268
|
+
|
269
|
+
// フォームから受け取った情報をもとにテーブルを検索、施設名から施設IDを引っ張り、日付と合わせて予約情報を取得しAjaxに返す。
|
270
|
+
|
271
|
+
public function searchReservation(Request $request) {
|
272
|
+
|
273
|
+
|
274
|
+
|
275
|
+
$data = $request->all();
|
276
|
+
|
277
|
+
|
278
|
+
|
279
|
+
if(isset($data['dateinfo']) && isset($data['facility_name'])) {
|
280
|
+
|
281
|
+
|
282
|
+
|
283
|
+
$dateinfo = $data['dateinfo'];
|
284
|
+
|
285
|
+
$facility_name = $data['facility_name'];
|
286
|
+
|
287
|
+
|
288
|
+
|
289
|
+
$reserveinfo = Reserve::SearchReserveDates($facility_name, $dateinfo);
|
290
|
+
|
291
|
+
|
292
|
+
|
293
|
+
\Debugbar::info();
|
294
|
+
|
295
|
+
|
296
|
+
|
297
|
+
return json_encode($reserveinfo, JSON_PRETTY_PRINT);
|
298
|
+
|
299
|
+
|
300
|
+
|
301
|
+
} else {
|
302
|
+
|
303
|
+
echo 'FAIL TO AJAX REQUEST';
|
172
304
|
|
173
305
|
}
|
174
306
|
|
@@ -176,492 +308,382 @@
|
|
176
308
|
|
177
309
|
|
178
310
|
|
311
|
+
// 入力確認画面に最終的なフォームの値を渡す。Requestにはバリデーションの拡張クラスを渡す。
|
312
|
+
|
313
|
+
public function confirm(CreateReserveRequest $request) {
|
314
|
+
|
315
|
+
|
316
|
+
|
317
|
+
// 予約情報取得
|
318
|
+
|
319
|
+
|
320
|
+
|
321
|
+
$data = $request->all();
|
322
|
+
|
323
|
+
|
324
|
+
|
325
|
+
if(isset($data['dateinfo']) && isset($data['facility_name'])) {
|
326
|
+
|
327
|
+
|
328
|
+
|
329
|
+
$dateinfo = $data['dateinfo'];
|
330
|
+
|
331
|
+
$facility_name = $data['facility_name'];
|
332
|
+
|
333
|
+
|
334
|
+
|
335
|
+
$reserveinfo = Reserve::SearchReserveDates($facility_name, $dateinfo);
|
336
|
+
|
337
|
+
}
|
338
|
+
|
339
|
+
|
340
|
+
|
341
|
+
|
342
|
+
|
343
|
+
// 取得したレコードを配列の形にする。
|
344
|
+
|
345
|
+
// start_timeとend_timeそれぞれの値で配列を作る。
|
346
|
+
|
347
|
+
|
348
|
+
|
349
|
+
$arr_start_time = array_column($reserveinfo, 'start_time');
|
350
|
+
|
351
|
+
// var_dump($arr_start_time);
|
352
|
+
|
353
|
+
$arr_end_time = array_column($reserveinfo, 'end_time');
|
354
|
+
|
355
|
+
// var_dump($arr_end_time);
|
356
|
+
|
357
|
+
|
358
|
+
|
359
|
+
// 選択された時間帯が予約時間と重複していないか検証
|
360
|
+
|
361
|
+
if(isset($data['start_time']) && isset($data['end_time'])) {
|
362
|
+
|
363
|
+
|
364
|
+
|
365
|
+
// datetime型に整形
|
366
|
+
|
367
|
+
$start_datetime =$data['dateinfo'] .' '. $data['start_time'];
|
368
|
+
|
369
|
+
$end_datetime =$data['dateinfo'] .' '. $data['end_time'];
|
370
|
+
|
371
|
+
|
372
|
+
|
373
|
+
// Carbonに整形
|
374
|
+
|
375
|
+
|
376
|
+
|
377
|
+
$st = new Carbon($start_datetime);
|
378
|
+
|
379
|
+
$start = $st->format('Y-m-d H:i:s');
|
380
|
+
|
381
|
+
// var_dump($start);
|
382
|
+
|
383
|
+
$ed = new Carbon($end_datetime);
|
384
|
+
|
385
|
+
$end = $ed->format('Y-m-d H:i:s');
|
386
|
+
|
387
|
+
// var_dump($end);
|
388
|
+
|
389
|
+
// テーブルから予約情報取得して配列に格納
|
390
|
+
|
391
|
+
// それぞれ$arr_start_time[]と$arr_end_times[]で呼び出せるようにする
|
392
|
+
|
393
|
+
// forかwhile文で$start_time[n]と$end_time[n]まで検証する
|
394
|
+
|
395
|
+
|
396
|
+
|
397
|
+
// $arr_start_time及び$arr_end_timeの配列の数を取得する。
|
398
|
+
|
399
|
+
$c1 = count($arr_start_time);
|
400
|
+
|
401
|
+
$c2 = count($arr_end_time);
|
402
|
+
|
403
|
+
|
404
|
+
|
405
|
+
|
406
|
+
|
407
|
+
// 時間帯比較の関数
|
408
|
+
|
409
|
+
function isTimeDuplication($start, $end, $start_time, $end_time) {
|
410
|
+
|
411
|
+
return ($start < $end_time && $start_time < $end);
|
412
|
+
|
413
|
+
}
|
414
|
+
|
415
|
+
// try-catchで例外が出たら処理中止する。
|
416
|
+
|
417
|
+
|
418
|
+
|
419
|
+
try {
|
420
|
+
|
421
|
+
|
422
|
+
|
423
|
+
for ($i=0; $i < $c1 && $c2 ; $i++) {
|
424
|
+
|
425
|
+
|
426
|
+
|
427
|
+
$start_time = $arr_start_time[$i];
|
428
|
+
|
429
|
+
$end_time = $arr_end_time[$i];
|
430
|
+
|
431
|
+
|
432
|
+
|
433
|
+
$result = isTimeDuplication($start, $end, $start_time, $end_time);
|
434
|
+
|
435
|
+
|
436
|
+
|
437
|
+
if($result === TRUE) {
|
438
|
+
|
439
|
+
throw new ReserveDuplicationException;
|
440
|
+
|
441
|
+
}
|
442
|
+
|
443
|
+
}
|
444
|
+
|
445
|
+
|
446
|
+
|
447
|
+
// 入力確認ページのviewにinputsを渡す
|
448
|
+
|
449
|
+
return view('reserve-confirm', [
|
450
|
+
|
451
|
+
'data' => $data,
|
452
|
+
|
453
|
+
]);
|
454
|
+
|
455
|
+
|
456
|
+
|
457
|
+
} catch(ReserveDuplicationException $e) {
|
458
|
+
|
459
|
+
throw $e;
|
460
|
+
|
461
|
+
}
|
462
|
+
|
463
|
+
|
464
|
+
|
465
|
+
|
466
|
+
|
467
|
+
}
|
468
|
+
|
469
|
+
}
|
470
|
+
|
179
471
|
|
180
472
|
|
181
473
|
```
|
182
474
|
|
183
475
|
|
184
476
|
|
185
|
-
#### m
|
477
|
+
#### View(formの部分だけ抜粋)
|
186
478
|
|
187
479
|
```php
|
188
480
|
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
|
196
|
-
|
197
|
-
|
198
|
-
|
199
|
-
|
200
|
-
|
201
|
-
|
202
|
-
|
203
|
-
|
204
|
-
|
205
|
-
|
206
|
-
|
207
|
-
p
|
208
|
-
|
209
|
-
|
210
|
-
|
211
|
-
p
|
212
|
-
|
213
|
-
|
214
|
-
|
215
|
-
|
216
|
-
|
217
|
-
|
218
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
224
|
-
|
225
|
-
|
226
|
-
|
227
|
-
|
228
|
-
|
229
|
-
|
230
|
-
|
231
|
-
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
|
236
|
-
|
237
|
-
|
238
|
-
|
239
|
-
|
240
|
-
|
241
|
-
|
242
|
-
|
243
|
-
|
244
|
-
|
245
|
-
|
246
|
-
|
247
|
-
|
248
|
-
|
249
|
-
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
255
|
-
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
|
261
|
-
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
273
|
-
|
274
|
-
|
275
|
-
|
276
|
-
|
277
|
-
|
278
|
-
|
279
|
-
}
|
481
|
+
|
482
|
+
|
483
|
+
<form method="POST" id="test">
|
484
|
+
|
485
|
+
@csrf
|
486
|
+
|
487
|
+
<div class="form-group row">
|
488
|
+
|
489
|
+
<label for="facility_name" class="col-md-4 col-form-label text-md-right">{{ __('facility_name' )}}</label>
|
490
|
+
|
491
|
+
|
492
|
+
|
493
|
+
<div class="col-md-6">
|
494
|
+
|
495
|
+
<select class="form-control" id="facility_name" name="facility_name">
|
496
|
+
|
497
|
+
<option value="blank" selected="selected">選択してください</option>
|
498
|
+
|
499
|
+
<option value="test1">test1</option>
|
500
|
+
|
501
|
+
<option value="test2">test2</option>
|
502
|
+
|
503
|
+
<option value="test3">test4</option>
|
504
|
+
|
505
|
+
</select>
|
506
|
+
|
507
|
+
|
508
|
+
|
509
|
+
</div>
|
510
|
+
|
511
|
+
</div>
|
512
|
+
|
513
|
+
|
514
|
+
|
515
|
+
<div class="form-group row">
|
516
|
+
|
517
|
+
<label for="dates" class="col-md-4 col-form-label text-md-right">{{ __('dates' )}}</label>
|
518
|
+
|
519
|
+
|
520
|
+
|
521
|
+
<div class="col-md-6">
|
522
|
+
|
523
|
+
<input type="text" class="form-control dateinfo" placeholder="Select Date.." id="dateinfo" name="dateinfo" readonly="readonly">
|
524
|
+
|
525
|
+
|
526
|
+
|
527
|
+
</div>
|
528
|
+
|
529
|
+
</div>
|
530
|
+
|
531
|
+
|
532
|
+
|
533
|
+
<div class="form-group row">
|
534
|
+
|
535
|
+
<div class="col-md-8 offset-md-4">
|
536
|
+
|
537
|
+
<button type="submit" class="btn btn-primary" data-action='javascript:void(0);' id="date-select">
|
538
|
+
|
539
|
+
{{ __('submit') }}
|
540
|
+
|
541
|
+
</button>
|
542
|
+
|
543
|
+
|
544
|
+
|
545
|
+
</div>
|
546
|
+
|
547
|
+
</div>
|
548
|
+
|
549
|
+
|
550
|
+
|
551
|
+
<div class="form-group row js-timeselectform" >
|
552
|
+
|
553
|
+
<label for="start_time" class="col-md-4 col-form-label text-md-right">{{ __('start_time' )}}</label>
|
554
|
+
|
555
|
+
|
556
|
+
|
557
|
+
<div class="col-md-6">
|
558
|
+
|
559
|
+
<input type="text" class="form-control time" placeholder="Select Time.." id="start_time" name="start_time" readonly="readonly">
|
560
|
+
|
561
|
+
|
562
|
+
|
563
|
+
</div>
|
564
|
+
|
565
|
+
</div>
|
566
|
+
|
567
|
+
|
568
|
+
|
569
|
+
<div class="form-group row js-timeselectform">
|
570
|
+
|
571
|
+
<label for="end_time" class="col-md-4 col-form-label text-md-right">{{ __('end_time' )}}</label>
|
572
|
+
|
573
|
+
|
574
|
+
|
575
|
+
<div class="col-md-6">
|
576
|
+
|
577
|
+
<input type="text" class="form-control time" placeholder="Select Time.." id="end_time" name="end_time" readonly="readonly">
|
578
|
+
|
579
|
+
|
580
|
+
|
581
|
+
</div>
|
582
|
+
|
583
|
+
</div>
|
584
|
+
|
585
|
+
|
586
|
+
|
587
|
+
<div class="form-group row js-timeselectform">
|
588
|
+
|
589
|
+
<div class="col-md-8 offset-md-4">
|
590
|
+
|
591
|
+
<button type="submit" class="btn btn-primary" data-action="{{ route('reserve.confirm') }}" id="reserve-settle">
|
592
|
+
|
593
|
+
{{ __('reserve-settle') }}
|
594
|
+
|
595
|
+
</button>
|
596
|
+
|
597
|
+
</div>
|
598
|
+
|
599
|
+
</div>
|
600
|
+
|
601
|
+
</form>
|
602
|
+
|
603
|
+
</div>
|
604
|
+
|
605
|
+
</div>
|
606
|
+
|
607
|
+
<!-- 予約時間重複によるエラーメッセージ表示。仮置してます。 -->
|
608
|
+
|
609
|
+
@if ($errors->any())
|
610
|
+
|
611
|
+
<ul id = "error" class="error">
|
612
|
+
|
613
|
+
@foreach ($errors->all() as $error)
|
614
|
+
|
615
|
+
|
616
|
+
|
617
|
+
<li>{{ $error }}</li>
|
618
|
+
|
619
|
+
|
620
|
+
|
621
|
+
@endforeach
|
622
|
+
|
623
|
+
</ul>
|
624
|
+
|
625
|
+
@endif
|
626
|
+
|
627
|
+
|
628
|
+
|
629
|
+
(後略)
|
280
630
|
|
281
631
|
```
|
282
632
|
|
283
633
|
|
284
634
|
|
635
|
+
## 質問に際してやったこと・作ったもの
|
636
|
+
|
637
|
+
|
638
|
+
|
639
|
+
####console.log一覧
|
640
|
+
|
285
|
-
|
641
|
+
![イメージ説明](bf9d85eeb4899a2eb321994921a1f7d8.png)
|
642
|
+
|
643
|
+
|
644
|
+
|
645
|
+
####定義しているテーブル
|
646
|
+
|
647
|
+
![イメージ説明](3ea1e3d5e942984d320f517afee539f5.png)
|
648
|
+
|
649
|
+
|
650
|
+
|
651
|
+
## 追記
|
652
|
+
|
653
|
+
|
654
|
+
|
655
|
+
####Handler.php
|
656
|
+
|
657
|
+
|
286
658
|
|
287
659
|
```php
|
288
660
|
|
661
|
+
|
662
|
+
|
663
|
+
public function prepareResponse($request, Exception $e) {
|
664
|
+
|
289
|
-
|
665
|
+
// 競合違反を条件分岐
|
290
|
-
|
291
|
-
|
292
|
-
|
666
|
+
|
293
|
-
n
|
667
|
+
if($e instanceof ConflictHttpException) {
|
294
|
-
|
295
|
-
|
296
|
-
|
668
|
+
|
297
|
-
us
|
669
|
+
return $this->invaildHttpRequest($request, $e);
|
670
|
+
|
298
|
-
|
671
|
+
}
|
672
|
+
|
673
|
+
// 予約時間が競合していた場合エラーハンドリング
|
674
|
+
|
299
|
-
|
675
|
+
if($e instanceof ReserveDuplicationException) {
|
676
|
+
|
300
|
-
|
677
|
+
return redirect()->back()->withInput()->withErrors('その時間帯はすでに予約が入っています');
|
678
|
+
|
679
|
+
}
|
680
|
+
|
681
|
+
|
682
|
+
|
301
|
-
u
|
683
|
+
return parent::prepareResponse($request, $e);
|
302
|
-
|
303
|
-
use Carbon\Carbon;
|
304
|
-
|
305
|
-
use Illuminate\Http\Request;
|
306
|
-
|
307
|
-
|
308
|
-
|
309
|
-
|
310
|
-
|
311
|
-
class ReserveController extends Controller {
|
312
|
-
|
313
|
-
|
314
|
-
|
315
|
-
// フォームから受け取った情報をもとにテーブルを検索、施設名から施設IDを引っ張り、日付と合わせて予約情報を取得しAjaxに返す。
|
316
|
-
|
317
|
-
public function searchReservation(Request $request) {
|
318
|
-
|
319
|
-
|
320
|
-
|
321
|
-
$data = $request->all();
|
322
|
-
|
323
|
-
|
324
|
-
|
325
|
-
if(isset($data['dateinfo']) && isset($data['facility_name'])) {
|
326
|
-
|
327
|
-
|
328
|
-
|
329
|
-
$dateinfo = $data['dateinfo'];
|
330
|
-
|
331
|
-
$facility_name = $data['facility_name'];
|
332
|
-
|
333
|
-
|
334
|
-
|
335
|
-
$reserveinfo = Reserve::SearchReserveDates($facility_name, $dateinfo);
|
336
|
-
|
337
|
-
|
338
|
-
|
339
|
-
\Debugbar::info();
|
340
|
-
|
341
|
-
|
342
|
-
|
343
|
-
return json_encode($reserveinfo, JSON_PRETTY_PRINT);
|
344
|
-
|
345
|
-
|
346
|
-
|
347
|
-
} else {
|
348
|
-
|
349
|
-
echo 'FAIL TO AJAX REQUEST';
|
350
684
|
|
351
685
|
}
|
352
686
|
|
353
|
-
}
|
354
|
-
|
355
|
-
|
356
|
-
|
357
|
-
// 入力確認画面に最終的なフォームの値を渡す。Requestにはバリデーションの拡張クラスを渡す。
|
358
|
-
|
359
|
-
public function confirm(CreateReserveRequest $request) {
|
360
|
-
|
361
|
-
|
362
|
-
|
363
|
-
// 予約情報取得
|
364
|
-
|
365
|
-
|
366
|
-
|
367
|
-
$data = $request->all();
|
368
|
-
|
369
|
-
|
370
|
-
|
371
|
-
if(isset($data['dateinfo']) && isset($data['facility_name'])) {
|
372
|
-
|
373
|
-
|
374
|
-
|
375
|
-
$dateinfo = $data['dateinfo'];
|
376
|
-
|
377
|
-
$facility_name = $data['facility_name'];
|
378
|
-
|
379
|
-
|
380
|
-
|
381
|
-
$reserveinfo = Reserve::SearchReserveDates($facility_name, $dateinfo);
|
382
|
-
|
383
|
-
}
|
384
|
-
|
385
|
-
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
// 取得したレコードを配列の形にする。
|
390
|
-
|
391
|
-
// start_timeとend_timeそれぞれの値で配列を作る。
|
392
|
-
|
393
|
-
|
394
|
-
|
395
|
-
$arr_start_time = array_column($reserveinfo, 'start_time');
|
396
|
-
|
397
|
-
// var_dump($arr_start_time);
|
398
|
-
|
399
|
-
$arr_end_time = array_column($reserveinfo, 'end_time');
|
400
|
-
|
401
|
-
// var_dump($arr_end_time);
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
// 選択された時間帯が予約時間と重複していないか検証
|
406
|
-
|
407
|
-
if(isset($data['start_time']) && isset($data['end_time'])) {
|
408
|
-
|
409
|
-
|
410
|
-
|
411
|
-
// datetime型に整形
|
412
|
-
|
413
|
-
$start_datetime =$data['dateinfo'] .' '. $data['start_time'];
|
414
|
-
|
415
|
-
$end_datetime =$data['dateinfo'] .' '. $data['end_time'];
|
416
|
-
|
417
|
-
|
418
|
-
|
419
|
-
// Carbonに整形
|
420
|
-
|
421
|
-
|
422
|
-
|
423
|
-
$st = new Carbon($start_datetime);
|
424
|
-
|
425
|
-
$start = $st->format('Y-m-d H:i:s');
|
426
|
-
|
427
|
-
// var_dump($start);
|
428
|
-
|
429
|
-
$ed = new Carbon($end_datetime);
|
430
|
-
|
431
|
-
$end = $ed->format('Y-m-d H:i:s');
|
432
|
-
|
433
|
-
// var_dump($end);
|
434
|
-
|
435
|
-
// テーブルから予約情報取得して配列に格納
|
436
|
-
|
437
|
-
// それぞれ$arr_start_time[]と$arr_end_times[]で呼び出せるようにする
|
438
|
-
|
439
|
-
// forかwhile文で$start_time[n]と$end_time[n]まで検証する
|
440
|
-
|
441
|
-
|
442
|
-
|
443
|
-
// $arr_start_time及び$arr_end_timeの配列の数を取得する。
|
444
|
-
|
445
|
-
$c1 = count($arr_start_time);
|
446
|
-
|
447
|
-
$c2 = count($arr_end_time);
|
448
|
-
|
449
|
-
|
450
|
-
|
451
|
-
|
452
|
-
|
453
|
-
// 時間帯比較の関数
|
454
|
-
|
455
|
-
function isTimeDuplication($start, $end, $start_time, $end_time) {
|
456
|
-
|
457
|
-
return ($start < $end_time && $start_time < $end);
|
458
|
-
|
459
|
-
}
|
460
|
-
|
461
|
-
// try-catchで例外が出たら処理中止する。
|
462
|
-
|
463
|
-
|
464
|
-
|
465
|
-
try {
|
466
|
-
|
467
|
-
|
468
|
-
|
469
|
-
for ($i=0; $i < $c1 && $c2 ; $i++) {
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
$start_time = $arr_start_time[$i];
|
474
|
-
|
475
|
-
$end_time = $arr_end_time[$i];
|
476
|
-
|
477
|
-
|
478
|
-
|
479
|
-
$result = isTimeDuplication($start, $end, $start_time, $end_time);
|
480
|
-
|
481
|
-
|
482
|
-
|
483
|
-
if($result === TRUE) {
|
484
|
-
|
485
|
-
throw new ReserveDuplicationException;
|
486
|
-
|
487
|
-
}
|
488
|
-
|
489
|
-
}
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
// 入力確認ページのviewにinputsを渡す
|
494
|
-
|
495
|
-
return view('reserve-confirm', [
|
496
|
-
|
497
|
-
'data' => $data,
|
498
|
-
|
499
|
-
]);
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
} catch(ReserveDuplicationException $e) {
|
504
|
-
|
505
|
-
throw $e;
|
506
|
-
|
507
|
-
}
|
508
|
-
|
509
|
-
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
}
|
514
|
-
|
515
|
-
}
|
516
|
-
|
517
687
|
|
518
688
|
|
519
689
|
```
|
520
|
-
|
521
|
-
|
522
|
-
|
523
|
-
#### View(formの部分だけ抜粋)
|
524
|
-
|
525
|
-
```php
|
526
|
-
|
527
|
-
|
528
|
-
|
529
|
-
<form method="POST" id="test">
|
530
|
-
|
531
|
-
@csrf
|
532
|
-
|
533
|
-
<div class="form-group row">
|
534
|
-
|
535
|
-
<label for="facility_name" class="col-md-4 col-form-label text-md-right">{{ __('facility_name' )}}</label>
|
536
|
-
|
537
|
-
|
538
|
-
|
539
|
-
<div class="col-md-6">
|
540
|
-
|
541
|
-
<select class="form-control" id="facility_name" name="facility_name">
|
542
|
-
|
543
|
-
<option value="blank" selected="selected">選択してください</option>
|
544
|
-
|
545
|
-
<option value="test1">test1</option>
|
546
|
-
|
547
|
-
<option value="test2">test2</option>
|
548
|
-
|
549
|
-
<option value="test3">test4</option>
|
550
|
-
|
551
|
-
</select>
|
552
|
-
|
553
|
-
|
554
|
-
|
555
|
-
</div>
|
556
|
-
|
557
|
-
</div>
|
558
|
-
|
559
|
-
|
560
|
-
|
561
|
-
<div class="form-group row">
|
562
|
-
|
563
|
-
<label for="dates" class="col-md-4 col-form-label text-md-right">{{ __('dates' )}}</label>
|
564
|
-
|
565
|
-
|
566
|
-
|
567
|
-
<div class="col-md-6">
|
568
|
-
|
569
|
-
<input type="text" class="form-control dateinfo" placeholder="Select Date.." id="dateinfo" name="dateinfo" readonly="readonly">
|
570
|
-
|
571
|
-
|
572
|
-
|
573
|
-
</div>
|
574
|
-
|
575
|
-
</div>
|
576
|
-
|
577
|
-
|
578
|
-
|
579
|
-
<div class="form-group row">
|
580
|
-
|
581
|
-
<div class="col-md-8 offset-md-4">
|
582
|
-
|
583
|
-
<button type="submit" class="btn btn-primary" data-action='javascript:void(0);' id="date-select">
|
584
|
-
|
585
|
-
{{ __('submit') }}
|
586
|
-
|
587
|
-
</button>
|
588
|
-
|
589
|
-
|
590
|
-
|
591
|
-
</div>
|
592
|
-
|
593
|
-
</div>
|
594
|
-
|
595
|
-
|
596
|
-
|
597
|
-
<div class="form-group row js-timeselectform" >
|
598
|
-
|
599
|
-
<label for="start_time" class="col-md-4 col-form-label text-md-right">{{ __('start_time' )}}</label>
|
600
|
-
|
601
|
-
|
602
|
-
|
603
|
-
<div class="col-md-6">
|
604
|
-
|
605
|
-
<input type="text" class="form-control time" placeholder="Select Time.." id="start_time" name="start_time" readonly="readonly">
|
606
|
-
|
607
|
-
|
608
|
-
|
609
|
-
</div>
|
610
|
-
|
611
|
-
</div>
|
612
|
-
|
613
|
-
|
614
|
-
|
615
|
-
<div class="form-group row js-timeselectform">
|
616
|
-
|
617
|
-
<label for="end_time" class="col-md-4 col-form-label text-md-right">{{ __('end_time' )}}</label>
|
618
|
-
|
619
|
-
|
620
|
-
|
621
|
-
<div class="col-md-6">
|
622
|
-
|
623
|
-
<input type="text" class="form-control time" placeholder="Select Time.." id="end_time" name="end_time" readonly="readonly">
|
624
|
-
|
625
|
-
|
626
|
-
|
627
|
-
</div>
|
628
|
-
|
629
|
-
</div>
|
630
|
-
|
631
|
-
|
632
|
-
|
633
|
-
<div class="form-group row js-timeselectform">
|
634
|
-
|
635
|
-
<div class="col-md-8 offset-md-4">
|
636
|
-
|
637
|
-
<button type="submit" class="btn btn-primary" data-action="{{ route('reserve.confirm') }}" id="reserve-settle">
|
638
|
-
|
639
|
-
{{ __('reserve-settle') }}
|
640
|
-
|
641
|
-
</button>
|
642
|
-
|
643
|
-
</div>
|
644
|
-
|
645
|
-
</div>
|
646
|
-
|
647
|
-
</form>
|
648
|
-
|
649
|
-
```
|
650
|
-
|
651
|
-
|
652
|
-
|
653
|
-
|
654
|
-
|
655
|
-
## 質問に際してやったこと・作ったもの
|
656
|
-
|
657
|
-
|
658
|
-
|
659
|
-
####console.log一覧
|
660
|
-
|
661
|
-
![イメージ説明](bf9d85eeb4899a2eb321994921a1f7d8.png)
|
662
|
-
|
663
|
-
|
664
|
-
|
665
|
-
####定義しているテーブル
|
666
|
-
|
667
|
-
![イメージ説明](3ea1e3d5e942984d320f517afee539f5.png)
|
3
指摘を受けた箇所を修正。
test
CHANGED
File without changes
|
test
CHANGED
@@ -296,6 +296,8 @@
|
|
296
296
|
|
297
297
|
use App\Reserve;
|
298
298
|
|
299
|
+
use App\Exceptions\ReserveDuplicationException;
|
300
|
+
|
299
301
|
use App\Http\Requests\CreateReserveRequest;
|
300
302
|
|
301
303
|
use Carbon\Carbon;
|
@@ -320,7 +322,7 @@
|
|
320
322
|
|
321
323
|
|
322
324
|
|
323
|
-
if(isset($
|
325
|
+
if(isset($data['dateinfo']) && isset($data['facility_name'])) {
|
324
326
|
|
325
327
|
|
326
328
|
|
@@ -360,168 +362,156 @@
|
|
360
362
|
|
361
363
|
// 予約情報取得
|
362
364
|
|
365
|
+
|
366
|
+
|
367
|
+
$data = $request->all();
|
368
|
+
|
369
|
+
|
370
|
+
|
371
|
+
if(isset($data['dateinfo']) && isset($data['facility_name'])) {
|
372
|
+
|
373
|
+
|
374
|
+
|
375
|
+
$dateinfo = $data['dateinfo'];
|
376
|
+
|
377
|
+
$facility_name = $data['facility_name'];
|
378
|
+
|
379
|
+
|
380
|
+
|
381
|
+
$reserveinfo = Reserve::SearchReserveDates($facility_name, $dateinfo);
|
382
|
+
|
383
|
+
}
|
384
|
+
|
385
|
+
|
386
|
+
|
387
|
+
|
388
|
+
|
389
|
+
// 取得したレコードを配列の形にする。
|
390
|
+
|
391
|
+
// start_timeとend_timeそれぞれの値で配列を作る。
|
392
|
+
|
363
393
|
|
364
394
|
|
395
|
+
$arr_start_time = array_column($reserveinfo, 'start_time');
|
396
|
+
|
397
|
+
// var_dump($arr_start_time);
|
398
|
+
|
399
|
+
$arr_end_time = array_column($reserveinfo, 'end_time');
|
400
|
+
|
401
|
+
// var_dump($arr_end_time);
|
402
|
+
|
403
|
+
|
404
|
+
|
405
|
+
// 選択された時間帯が予約時間と重複していないか検証
|
406
|
+
|
365
|
-
if(isset($
|
407
|
+
if(isset($data['start_time']) && isset($data['end_time'])) {
|
408
|
+
|
409
|
+
|
410
|
+
|
366
|
-
|
411
|
+
// datetime型に整形
|
412
|
+
|
367
|
-
|
413
|
+
$start_datetime =$data['dateinfo'] .' '. $data['start_time'];
|
414
|
+
|
368
|
-
|
415
|
+
$end_datetime =$data['dateinfo'] .' '. $data['end_time'];
|
416
|
+
|
417
|
+
|
418
|
+
|
419
|
+
// Carbonに整形
|
420
|
+
|
421
|
+
|
422
|
+
|
423
|
+
$st = new Carbon($start_datetime);
|
424
|
+
|
425
|
+
$start = $st->format('Y-m-d H:i:s');
|
426
|
+
|
427
|
+
// var_dump($start);
|
428
|
+
|
429
|
+
$ed = new Carbon($end_datetime);
|
430
|
+
|
369
|
-
$
|
431
|
+
$end = $ed->format('Y-m-d H:i:s');
|
432
|
+
|
370
|
-
|
433
|
+
// var_dump($end);
|
434
|
+
|
435
|
+
// テーブルから予約情報取得して配列に格納
|
436
|
+
|
437
|
+
// それぞれ$arr_start_time[]と$arr_end_times[]で呼び出せるようにする
|
438
|
+
|
439
|
+
// forかwhile文で$start_time[n]と$end_time[n]まで検証する
|
440
|
+
|
441
|
+
|
442
|
+
|
443
|
+
// $arr_start_time及び$arr_end_timeの配列の数を取得する。
|
444
|
+
|
445
|
+
$c1 = count($arr_start_time);
|
446
|
+
|
447
|
+
$c2 = count($arr_end_time);
|
448
|
+
|
449
|
+
|
450
|
+
|
451
|
+
|
452
|
+
|
453
|
+
// 時間帯比較の関数
|
454
|
+
|
455
|
+
function isTimeDuplication($start, $end, $start_time, $end_time) {
|
456
|
+
|
457
|
+
return ($start < $end_time && $start_time < $end);
|
458
|
+
|
459
|
+
}
|
460
|
+
|
461
|
+
// try-catchで例外が出たら処理中止する。
|
462
|
+
|
463
|
+
|
464
|
+
|
465
|
+
try {
|
466
|
+
|
467
|
+
|
468
|
+
|
469
|
+
for ($i=0; $i < $c1 && $c2 ; $i++) {
|
470
|
+
|
471
|
+
|
472
|
+
|
371
|
-
$
|
473
|
+
$start_time = $arr_start_time[$i];
|
474
|
+
|
372
|
-
|
475
|
+
$end_time = $arr_end_time[$i];
|
373
|
-
|
374
|
-
|
476
|
+
|
477
|
+
|
478
|
+
|
375
|
-
$res
|
479
|
+
$result = isTimeDuplication($start, $end, $start_time, $end_time);
|
480
|
+
|
481
|
+
|
482
|
+
|
483
|
+
if($result === TRUE) {
|
484
|
+
|
485
|
+
throw new ReserveDuplicationException;
|
486
|
+
|
487
|
+
}
|
488
|
+
|
489
|
+
}
|
490
|
+
|
491
|
+
|
492
|
+
|
493
|
+
// 入力確認ページのviewにinputsを渡す
|
494
|
+
|
495
|
+
return view('reserve-confirm', [
|
496
|
+
|
497
|
+
'data' => $data,
|
498
|
+
|
499
|
+
]);
|
500
|
+
|
501
|
+
|
502
|
+
|
503
|
+
} catch(ReserveDuplicationException $e) {
|
504
|
+
|
505
|
+
throw $e;
|
506
|
+
|
507
|
+
}
|
508
|
+
|
509
|
+
|
376
510
|
|
377
511
|
|
378
512
|
|
379
513
|
}
|
380
514
|
|
381
|
-
|
382
|
-
|
383
|
-
// 取得したレコードを配列の形にする。
|
384
|
-
|
385
|
-
// start_timeとend_timeそれぞれの値で配列を作る。
|
386
|
-
|
387
|
-
|
388
|
-
|
389
|
-
$arr_start_time = array_column($reserveinfo, 'start_time');
|
390
|
-
|
391
|
-
var_dump($arr_start_time);
|
392
|
-
|
393
|
-
$arr_end_time = array_column($reserveinfo, 'end_time');
|
394
|
-
|
395
|
-
var_dump($arr_end_time);
|
396
|
-
|
397
|
-
|
398
|
-
|
399
|
-
// 選択された時間帯が予約時間と重複していないか検証
|
400
|
-
|
401
|
-
if(isset($_POST['start_time']) && isset($_POST['end_time'])) {
|
402
|
-
|
403
|
-
|
404
|
-
|
405
|
-
// datetime型に整形
|
406
|
-
|
407
|
-
$start_datetime =$_POST['dateinfo'] .' '. $_POST['start_time'];
|
408
|
-
|
409
|
-
$end_datetime =$_POST['dateinfo'] .' '. $_POST['end_time'];
|
410
|
-
|
411
|
-
|
412
|
-
|
413
|
-
// Carbonに整形
|
414
|
-
|
415
|
-
|
416
|
-
|
417
|
-
$st = new Carbon($start_datetime);
|
418
|
-
|
419
|
-
$start = $st->format('Y-m-d H:i:s');
|
420
|
-
|
421
|
-
var_dump($start);
|
422
|
-
|
423
|
-
$ed = new Carbon($end_datetime);
|
424
|
-
|
425
|
-
$end = $ed->format('Y-m-d H:i:s');
|
426
|
-
|
427
|
-
var_dump($end);
|
428
|
-
|
429
|
-
// テーブルから予約情報取得して配列に格納
|
430
|
-
|
431
|
-
// それぞれ$arr_start_time[]と$arr_end_times[]で呼び出せるようにする
|
432
|
-
|
433
|
-
// forかwhile文で$start_time[n]と$end_time[n]まで検証する
|
434
|
-
|
435
|
-
|
436
|
-
|
437
|
-
// $arr_start_time及び$arr_end_timeの配列の数を取得する。
|
438
|
-
|
439
|
-
$c1 = count($arr_start_time);
|
440
|
-
|
441
|
-
$c2 = count($arr_end_time);
|
442
|
-
|
443
|
-
|
444
|
-
|
445
|
-
/*
|
446
|
-
|
447
|
-
以下の関数を用いてフォームで選択された時間と登録されている予約情報の時間とで
|
448
|
-
|
449
|
-
比較を行い、予約済みの時間帯と重複していた場合はエラーハンドリングを行いたい。
|
450
|
-
|
451
|
-
*/
|
452
|
-
|
453
|
-
function isTimeDuplication($start, $end, $start_time, $end_time) {
|
454
|
-
|
455
|
-
return ($start < $end_time && $start_time < $end);
|
456
|
-
|
457
|
-
}
|
458
|
-
|
459
|
-
|
460
|
-
|
461
|
-
// 予約情報の数だけ時間帯比較を行いたいと考えて以下のようなコードを書いた。
|
462
|
-
|
463
|
-
for ($i=0; $i < $c1 && $c2 ; $i++) {
|
464
|
-
|
465
|
-
|
466
|
-
|
467
|
-
$start_time = $arr_start_time[$i];
|
468
|
-
|
469
|
-
$end_time = $arr_end_time[$i];
|
470
|
-
|
471
|
-
|
472
|
-
|
473
|
-
$result = isTimeDuplication($start, $end, $start_time, $end_time);
|
474
|
-
|
475
|
-
|
476
|
-
|
477
|
-
// 時間帯比較がTRUE、つまり重複した時間帯があった場合エラーメッセージ、違うなら比較をを続行する。
|
478
|
-
|
479
|
-
if(isTimeDuplication($start, $end, $start_time, $end_time) === TRUE) {
|
480
|
-
|
481
|
-
echo 'error';
|
482
|
-
|
483
|
-
var_dump($result);
|
484
|
-
|
485
|
-
break;
|
486
|
-
|
487
|
-
|
488
|
-
|
489
|
-
}
|
490
|
-
|
491
|
-
|
492
|
-
|
493
|
-
|
494
|
-
|
495
|
-
}
|
496
|
-
|
497
|
-
|
498
|
-
|
499
|
-
// ここまで書いてもしかしたら、try-catchしたほうがいいけどその場合例外処理どうするのだろうと詰まりました。
|
500
|
-
|
501
|
-
|
502
|
-
|
503
|
-
// 以下は比較でいずれも例外が認められなかった場合の処理
|
504
|
-
|
505
|
-
|
506
|
-
|
507
|
-
//フォームから受け取ったすべてのinputの値を取得
|
508
|
-
|
509
|
-
$inputs = $request->all();
|
510
|
-
|
511
|
-
|
512
|
-
|
513
|
-
// 確認ページのviewにinputsを渡す
|
514
|
-
|
515
|
-
return view('reserve-confirm', [
|
516
|
-
|
517
|
-
'inputs' => $inputs,
|
518
|
-
|
519
|
-
]);
|
520
|
-
|
521
|
-
}
|
522
|
-
|
523
|
-
|
524
|
-
|
525
515
|
}
|
526
516
|
|
527
517
|
|
2
レイアウト修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -666,10 +666,12 @@
|
|
666
666
|
|
667
667
|
|
668
668
|
|
669
|
+
####console.log一覧
|
670
|
+
|
669
|
-
|
671
|
+
![イメージ説明](bf9d85eeb4899a2eb321994921a1f7d8.png)
|
670
|
-
|
671
|
-
|
672
|
-
|
672
|
+
|
673
|
+
|
674
|
+
|
673
|
-
定義しているテーブル
|
675
|
+
####定義しているテーブル
|
674
676
|
|
675
677
|
![イメージ説明](3ea1e3d5e942984d320f517afee539f5.png)
|
1
誤字修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -58,7 +58,7 @@
|
|
58
58
|
|
59
59
|
#### AjaxでPHPから帰ってくる予約情報
|
60
60
|
|
61
|
-
ちなみにid3
|
61
|
+
ちなみにid3は2019-11-30とは別の日付の予約情報なので弾かれています。
|
62
62
|
|
63
63
|
```
|
64
64
|
|