2016-03-03 45 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)

相关问题