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

Shunsuke Sawada

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

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

1
2
3
4
5
6
7
8
9
10
11
12
$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
)
とすれば良いと思います。

1
Shunsuke Sawada

おすすめの記事

CakePHP 2.x JSヘルパーでajax通信(ajax helperは使わない)
20
Rails4でQiita投稿ボタンをつくった
18
紙のデザイナーがウェブ開発できるようになるまでに必要なこと
451