2016-03-03 57 views
0

因此,我有一個表中的tm_timekeep(id(pk),開始(varchar),結束(varchar))[和它的模型]在數據庫中的HH:MM格式的一些時間間隔。例如:如何檢查時間間隔是否在Laravel 4.2/php中重疊?

id|start|end | 
--------------- 
0 |10:00|10:30| 
1 |11:23|11:55| 
2 |13:15|15:39| 

我想要插入新行並修改現有的行,如果沒有間隔之間的重疊。 如果我想添加爲間隔11:57-12:40會好的,但09:00-10:20不會因10:00-10:30而更新,這與更新行相同。如果我想更新一行,我需要一個函數在修改行之前檢查條件。我應該怎麼做? 我當前的代碼片段:

public function checkInterval($start, $end){ 
$counter = 0; 
$timekeepArray = Timekeep::all(); 
$start = date('H:i',Input::get('start')); 
$end = date('H:i',Input::get('end')); 
foreach($timekeepArray as $timekeep) 
{ 
if($start <= $timekeep->end && $end>=$timekeep->start){ 
    counter++; //in range 
} 
    return counter; 
    } 
} 

在此之後我檢查計數器的值,但我的問題是,我總是得到0,即使有來自輸入的重疊。

回答

0

這非常簡單 - 將您的時間間隔轉換爲分鐘,例如。 10:00變成10 * 60 + 0 = 600分鐘,相應地結束於630。

然後,當你試圖插入或更新,我會建議你做它Timekeep模型,勢必「節能」模式的事件(見Model Events),你檢查:

1)挑最後結束時間小於新的開始時間(這是一個微不足道的SQL查詢) 2)查看在結束時間和新結束時間之間是否有任何現存時間 - 如果存在,我們有重疊。拋出異常,取消模型保存

有幾種方法可以將字符串轉換爲分鐘 - 您可以在MySQL中存儲整數(例如600),然後通過定義getAttribute()或將它們轉換爲人類可讀的時間自己的方法。或者,您可以將數據保存爲VARCHAR,並在SQL或PHP中執行簡單的字符串操作(刪除':',將第一部分乘以60)

相關問題