[CakePHP]時間の重複がないかMySQLデータベースに問い合わせる

[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)
);
idstart_timeend_timedescription
12011-12-19 10:00:002011-12-19 10:30:00休憩
22011-12-19 10:30:002011-12-19 11:00:00移動
32011-12-19 12:00:002011-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);

これでもテスト通ります。今日は、時間を記録するアプリで、重複しているデータを調べる方法を紹介しました。

  • このエントリーをはてなブックマークに追加

この記事を読んだ人にオススメ