[CakePHP]時間の重複がないかMySQLデータベースに問い合わせる
CakePHP2.0でいろいろ遊んでます、tanakaです。最近、AuthComponentをさわっていて、1.xとは割と違うかも、と思い始めてます。
今日は、時間の重複がないかチェックする方法を紹介します。
時間を記録するアプリを作っていて、各レコードには、開始時刻と終了時刻を入力します。
create table activities (
id INT AUTO_INCREMENT not null
, start_time DATETIME not null
, end_time DATETIME not null
, description VARCHAR(100) not null
, constraint activities_PKC primary key (id)
);
id | start_time | end_time | description |
---|---|---|---|
1 | 2011-12-19 10:00:00 | 2011-12-19 10:30:00 | 休憩 |
2 | 2011-12-19 10:30:00 | 2011-12-19 11:00:00 | 移動 |
3 | 2011-12-19 12:00:00 | 2011-12-19 15:00:00 | プログラミング |
ここに新しくレコードを追加するとき、重複がないことをどうチェックしたらいいでしょうか? 最初私は次の様に考えました(CakePHPの検索条件)
$params = array(
'conditions' => array(
'or' => array(
array(
"Activity.start_time >" => $data['Activity']['start_time'],
"Activity.start_time <" => $data['Activity']['end_time'],
),
array(
"Activity.end_time <" => $data['Activity']['end_time'],
"Activity.end_time >" => $data['Activity']['start_time'],
),
array(
"Activity.start_time <=" => $data['Activity']['start_time'],
"Activity.end_time >=" => $data['Activity']['end_time'],
),
),
),
);
$duplicate = $this->find('first', $params);
この条件で検索すると、重複しているレコードを取得できます。まぁ、これでもテストは通ったんですけど。検索してみると、目からウロコな方法があるものですね。
// 開始時刻1 < 終了時刻2 && 開始時刻2 < 終了時刻1
$startTime1 < $endTime2 && $startTime2 < $endTime1
PHPで二つの時間帯が重複しないかチェックする 創作メモ帳より抜粋
なぜこの式でチェックできるのかというと、2つの時間が重複しているとき、2つの終了時刻は、お互いの開始時刻より後になり(数値的には大きい)、重複していないときは、そうならない、ということです。この式に従って書き直したのがつぎになります。
$params = array(
'conditions' => array(
array(
"Activity.start_time <" => $data['Activity']['end_time'],
"Activity.end_time >" => $data['Activity']['start_time'],
),
),
);
$duplicate = $this->find('first', $params);
これでもテスト通ります。今日は、時間を記録するアプリで、重複しているデータを調べる方法を紹介しました。