CakePHPで指定期間が他のデータと重複していないかチェックする(CakePHPじゃなくてもいいけど)

予約システムなんかをつくる時に、
○月○日〜○月○日の予約は可能かどうか判断する必要があります。

Bookingテーブルにはstartとendがあるという想定です。
こんな感じ。

$overlap = $this->Booking->find('first', array(
            'conditions' => array(
                'Booking.start <' => $end,
                'Booking.end >' => $start
                ),
            'recursive' => 0));

if ($overlap) {
 $result = '重複してるから予約できないよ!';
} else {
 $result = '重複OKだよ。';
}

'Booking.start <' => $end,
'Booking.end >' => $start

一瞬 ? てなるけど、図にすると分かりやすいかも。

予約システム

Booking.start < $end
なおかつ
Booking.end > $start
に当てはまるのは、A,B,C,F。

よって、A,B,C,Fのデータがもしなければ(false)予約できる
A,B,C,Fみたいなデータがあれば、(true)予約できない。

CakePHP以外でも同じですが、CakePHPの場合だと、
'conditions' => array(
'Booking.start <' => $end,
'Booking.end >' => $start
)
とすれば良いと思います。

何かありましたらコメントをどうぞ

comments powered by Disqus

人気の記事

950 Points チリ出身のギタリストが弾くドラゴンボールZがむちゃくちゃかっこいい…
774 Points Wordpress + Heroku + PostgreSQL + Amazon S3 = ¥0 / 無料でサイト運営
700 Points Rubyのチートシート 変数 / クラス / モジュール
524 Points Rubyのチートシート / アクティブサポート
451 Points 紙のデザイナーがウェブ開発できるようになるまでに必要なこと
435 Points Rails / Google Analyticsのデータを使って分析や管理画面のためのグラフをつくる
323 Points RailsとHerokuでノーティフィケーションをプッシュする / PusherとTurbolinksの兼ね合い
222 Points Rails / RSpec テスト書いたことない メンドクサイ(n´Д`)という時のチートシート
193 Points Rails / Ajaxを使って画面遷移しない一時保存機能をつける
193 Points Protractorでスクレイピングしてみた