验证以检查与以前的预订不存在重叠

Posted

技术标签:

【中文标题】验证以检查与以前的预订不存在重叠【英文标题】:Validation to check no existing overlaps with previous bookings 【发布时间】:2021-09-12 09:01:49 【问题描述】:

我需要验证预订的日期和时间与 如果预订与现有预订重叠,则现有预订和退货和错误。

这是我现在拥有的代码,但它不起作用,当我进行与现有预订重叠的另一个预订时,它仍然通过并且没有返回错误。

CREATE TABLE IF NOT EXISTS books (
id integer not null primary key autoincrement
created_at datetime, 
updated_at datetime,
carid integer,
sdate date not null,
edate date not null,
stime time not null,
etime time not null,
userid integer,
 foreign key("carid") references "cars"("id") on delete cascade, foreign key("userid") 
    references "users"("id") on delete cascade
);



$temp=DB::table('books')->where('sdate','>=',$sdate)->where('edate', '<=',$edate)->where('stime', '>=',$stime) ->where('etime','<=',$etime)->get();
if($temp) 
    $errorMsg="This overlaps with an existing booking, please choose another time.";
    $code='1';
    echo '<script type="text/javascript">alert("'.$errorMsg.'");</script>';

else 
    //ok

【问题讨论】:

欢迎。数据库中这些列的数据类型是什么,变量中的值是什么?请向我们展示一些真实数据,以便我们了解实际情况。顺便说一句,为什么不将日期和时间放在一个日期时间字段中,而不是将它们分成不同的列? 谢谢,我添加了数据让你看看发生了什么 请再次阅读我的评论并回复所有个问题/信息请求。 【参考方案1】:

尝试类似:

if (count($temp) > 0) 
    $errorMsg="This overlaps with an existing booking, please choose another time.";
    $code='1';
    echo '<script type="text/javascript">alert("'.$errorMsg.'");</script>';
 else 
    //ok

【讨论】:

@a_puddycat 如果您 dd($temp) 使用现有记录,输出是什么?也许你的变量仍然是null,这就是错误没有显示的原因【参考方案2】:

试试

$temp=DB::table('books')
->where(function($query)use($sdate,$edate)
     $query->whereBetween('sdate', [$sdate,$edate])
    ->orWhereBetween('edate', [$sdate,$edate]);
 )->where('stime','>=',$stime)->orWhere('etime','<=',$etime)->count();
if($temp > 0)
....
else
....

【讨论】:

以上是关于验证以检查与以前的预订不存在重叠的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 5.2 验证帮助存在于数据库中

sql时间范围查询重叠

关于sql--时间范围查询重叠

SQL Server:时间范围查询重叠

在画布中随机生成对象,不重复或重叠

如何检查网页是不是存在。 jQuery 和/或 PHP