【发布时间】:2018-03-22 05:22:07
【问题描述】:
我正在为已借出的产品开发一个借出系统界面(类似于图书馆借阅系统)。我正在从数据库中检索一组满足一些基本条件的产品,然后我需要将它们显示在一个表格中并标记可用的和不可用的。
可用性是通过将用户输入的日期范围与每个产品的任何现有贷款的一系列日期范围进行比较来确定的。例如,用户可能输入 MM/DD/YYYY 格式的开始日期 03/26/2018 和结束日期 03/26/2018 并且产品可能具有现有的预订日期范围列表,例如 10/27/2017 - 05/01/2018,05/10/2018 - 05/21/2018, 08/10/2018 - 12/20/2018 其中每个日期范围为现有预订以逗号分隔。
我正在使用 foreach 循环来检索要在我的表中显示的初始产品集,因此我希望同时在 foreach 循环中加入一个测试,并确定每个产品是否可用。如果请求的开始/结束日期与任何现有产品预订日期之间没有重叠,则该产品可用,否则不可用。
这是我当前结构的一个示例:
$loanStartDateRequested = '03/26/2018';
$loanEndDateRequested = '03/26/2018';
foreach($records as $record) {
$existingLoanDateRanges = $record->getField('loanDateRanges');
// this returns the comma separated values of existing date ranges
// would like to test and compare the dates here and set a variable if available/not available
}
【问题讨论】:
-
如果您在数据库中使用逗号分隔日期范围,那么您的表格没有被规范化,并且您正在为一个长期受到伤害的世界做好准备。如果您正确设置数据库表,您将能够编写巧妙的查询来为您完成所有搜索/过滤——而不是使用 php.ini 搜索巨大的结果集并清除它们。请采纳这个建议,对规范化主题进行研究,稍后再感谢您自己。
-
同意 mickmackusa。您违反了将一系列日期作为逗号分隔的字符串粘贴到 varchar 中的基本关系设计。该设计非常低效、有限且容易出错,更不用说要求您查看符合您标准的每一个产品,如果有适当的设计,您的查询将有效地只找到可用的产品在所需的范围内,并且会通过 SQL WHERE 子句这样做。您的贷款应使用 start_date、end_date DATE 列建模。