CakePHPで指定期間が他のデータと重複していないかチェックする(CakePHPじゃなくてもいいけど)
予約システムなんかをつくる時に、
○月○日〜○月○日の予約は可能かどうか判断する必要があります。
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
)
とすれば良いと思います。