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

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

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

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

2回答

1702閲覧

Laravel 5.1タイムレンジのバリデーション

退会済みユーザー

退会済みユーザー

総合スコア0

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2015/09/26 08:47

Laravel5.1で予約サイトを作っています。
予約するには、名前などの他に、開始時間(start_time)と終了時間(end_time)をフォームから入力します。
予約内容は、データベースに保存しています。

したがって、多くの予約内容がデータベースに保存されています。

ここで、新たな予約をフォームから行うとき、同じ時間帯に被らないようにしたいです。
つまり、新たな予約者が、フォームに開始時間と終了時間を入力し、予約ボタンを押したとき、既存の予約で時間帯が被る予約が存在した場合にエラーを吐くようなバリデーションは可能でしょうか?

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

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

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

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

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

guest

回答2

0

ベストアンサー

gouf様、ありがとうございました。結局ControllerでValidationしました。
参考
http://laravel.com/docs/5.1/validation#other-validation-approaches

下記のようにstore()とupdate()にそれぞれコードを書きました。

PHP

1 public function store(Requests\ForwardingRequest $request) 2 { 3 $input = $request->all(); 4 5 $start = $input['start_time']; 6 $end = $input['end_time']; 7 8 $overlap_1 = Forwarding::where('start_time', '<=', $start)->where('end_time', '>', $start)->get(); 9 $overlap_2 = Forwarding::where('start_time', '>=', $start)->where('start_time', '<', $end)->get(); 10 11 if(count($overlap_1) == 0 && count($overlap_2) == 0){ 12 13 Forwarding::create($input); 14 15 return redirect('forwardings'); 16 } 17 else{ 18 return view('errors.overlap'); 19 } 20 21 } 22 23 public function update(Requests\ForwardingRequest $request, $id) 24 { 25 $forwarding = Forwarding::findOrFail($id); 26 $input = $request->all(); 27 $start = $input['start_time']; 28 $end = $input['end_time']; 29 30 $overlap_1 = Forwarding::whereNotIn('id', [$id])->where('start_time', '<=', $start)->where('end_time', '>', $start)->get(); 31 $overlap_2 = Forwarding::whereNotIn('id', [$id])->where('start_time', '>=', $start)->where('start_time', '<', $end)->get(); 32 33 if(count($overlap_1) == 0 && count($overlap_2) == 0){ 34 35 $forwarding->update($input); 36 37 return redirect('forwardings'); 38 } 39 else{ 40 return view('errors.overlap'); 41 } 42 } 43 44 45

投稿2015/09/26 22:08

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

日付に関するバリデーション(*1)の質問に回答したことがあるのですが、Laravel でも同様にカスタムバリデーション機能によって 実現できるのではないでしょうか

今回の場合、データベースに該当レコードがないか問い合わせる必要がありそうですね

簡単に調べてみましたが、何か参考になれば幸いです

*1) rails validatesについて(5046)|teratail

Link

投稿2015/09/26 13:01

gouf

総合スコア2321

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問