我为汽车租赁公司创建了一个预订系统,我在设置汽车可用性时遇到了问题.
它的工作原理的一个简单示例是,单个汽车在预订时收到yes数据库中字段内的值bookedout
好的,所以说例如,有10辆车(这是不切实际的小但是证明了这一点)
其中一辆是奥迪R8.
今天的日期是2012年3月6日.
用户从3月26日到3月31日预订车辆.但他们今天通过网站预订.我无法立即设定bookedout价值,yes或者网站实际上会认为从3月6日到3月31日该车无法使用.
这种情况会使公司的资金减少.
所以我正在寻找像服务器上的脚本,检查当前日期,然后每天检查数据库.例如,如果在今天的日期开始预订,则会更改数据库中的值,以便从当天开始无法预订汽车.
反过来,我也可以调整它来改变汽车返回日期的价值.
我并不是专门寻找代码(虽然我不会对示例说不),只是一个起点来解决这个问题,因为我之前从未这样做过.
基本上,我需要一种方法来在特定日期触发查询,而无需任何用户交互.
任何帮助都会受到重视.:)
我会以答案的形式为你详细说明这一点,虽然我不会发布任何代码,因为我认为没有必要回答这个问题.
你的数据库结构应该是这样的(汽车租赁公司想要的许多领域 - 例如里程,损坏等 - 为简洁起见而遗漏):
汽车
顾客
预订
这个想法是你永远不会存储预订状态car.而是创建一个reservationwith start_date并end_date设置为预订的日期.
您查询可用于给定日期范围的汽车的查询将是:
SELECT
c.car_id
FROM
cars c
LEFT JOIN reservations r ON (
c.car_id = r.car_id
AND r.start_date <= $reservationEndDate
AND r.end_date >= $reservationStartDate
)
WHERE
r.reservation_id IS NULL
Run Code Online (Sandbox Code Playgroud)
使用此模型,您永远不必担心运行基于时间的作业来更新汽车保留状态.虽然,优化应用程序,你可能会遇到一个每天的工作是更新车状态,因此您可以快速找出有多少车都是可用的今天.
附加说明
正如NB在评论中指出的那样 - 您需要确保您的应用程序不允许在预订表中使用冲突的日期范围.没有可以解决此问题的唯一索引,因此您需要在应用程序逻辑中处理此问题 - 请注意竞争条件.一个可能的解决方案是在有人在特定日期范围内查看汽车时立即创建临时预订.
另一个附加说明
NB还有一个很好的建议,以避免上述问题:使用数据库触发器来验证服务器端.如果创建了另一个冲突的预订,数据库可以拒绝触发器中的INSERT.这个解决方案可能是最好的,因为它使验证尽可能接近数据(因此您不能在应用程序中"忘记"它).