php - 根据日期返回一个函数
问题描述
我在 silverstripe 中创建了一个页面(TheatrePage),其中包含开始日期和结束日期(Theatrepages 是 TheatreHolder 的子项)
private static $db = [
'StartDate' => 'Date',
'FinishDate' => 'Date',
];
我需要在另一个页面中循环浏览这些剧院的第一周和最后一周。(例如,剧院 StartDate=2018,11,01 & FinishDate=2019,03,15 if the today=2018,11,05{$Now}
在 FirstWeekPage 中循环 & if today {$Now}
=2019,03,12 在 LastWeekPage 中显示)
<?php
namespace Project;
use Page;
use PageController;
class FirstWeek extends Page {
private static $singular_name = 'FirstWeek';
private static $description = 'FirstWeek';
private static $table_name = 'FirstWeek';
}
class FirstWeekController extends PageController {
function InFirstWeek($limit = 99999)
{
if ("StartDate <= Now < StartDate + 7") {
return Theatre::get()->limit($limit)->sort('StartDate ASC');
}
}
}
解决方案
您的 Thatre 课程就像:
class Theatre extends Page
{
private static $db = [
'StartDate' => 'Date',
'FinishDate' => 'Date',
];
private static $default_sort = 'StartDate ASC';
}
如果您想获得所有剧院页面,您必须运行
Teatre::get();
这将返回所有剧院页面,按“StartDate ASC”排序,因为我default_sort
在课堂上定义了它。更简洁的代码总是好的;)
现在您想获取本周开始的所有剧院页面。SQLNOW()
不能被 MySQL 缓存,所以我们手动计算。
为了计算日期,我们可以使用PHP 内置的 DateTime 类:
$today = new DateTime('today');
// set time to midnight
$today = $today->setTime(0, 0);
MySQL 格式要我以 format 查询YYYY-MM-DD HH:MM:SS
,所以让我们创建字符串:
$todayString = $today->format('Y-m-d H:i:s');
现在我们可以通过过滤 StartDate 大于或等于今天午夜的所有事件来获取今天开始的所有事件:
$allTheatres = Theatre::get()->filter(['StartDate:GreaterThanOrEqual' => $todayString]);
接下来我们计算一周的日期字符串。因此我们在今天的 DateTime 对象上添加 7 天:添加一周的 DateInterval 对象:
$inAWeek = $today->add(DateInterval::createFromDateString('1 week');
但是我们想包括一整天,所以如果它从 23:00 开始,我们仍然希望它包括在内,因此让我们将时间设置为午夜前一分钟:
$inAWeek = $inAWeek->setTime(23,59);
并为查询生成字符串:
$inAWeekString = $inAWeek->format('Y-m-d H:i:s');
现在获取今天和一周内的所有剧院。从数据库的角度来看,我们需要所有数据集,其中开始日期大于今天,同时开始日期小于一周。使用 SilverStripe 的 ORM,我们可以像这样使用搜索过滤器修饰符进行过滤:
$allTheatresStartingThisWeek = Theatre::get()->filter([
'StartDate:GreaterThanOrEqual' => $todayString,
'StartDate:LessThanOrEqual' => $inAWeekString,
]);
结束日期也是如此。
现在我们希望所有剧院要么在本周开始,要么在本周结束。对于OR
过滤,我们需要使用filterAny()。
$allTheatresThisWeek = Theatre::get()->filterAny([
[
'StartDate:GreaterThanOrEqual' => $todayString,
'StartDate:LessThanOrEqual' => $inAWeekString,
],
[
'EndDate:GreaterThanOrEqual' => $todayString,
'EndDate:LessThanOrEqual' => $inAWeekString,
],
]);
注意:这会返回 a DataList
,而不是实际结果,您可以稍后在模板或其他方法中对其进行优化。
推荐阅读
- sql - 如何避免在数据库中创建新列
- python - 使用opencv python对网格中的单元格进行编号
- python - Fitbit 到 Dataframe 的步骤
- reactjs - 如何启用一键运行 Fastapi 和 React 应用程序?
- shopify - 在液体中循环
- image - Flutter 轻松合成/覆盖资产目录中的 PNG 图像
- azure-devops - Devops 构建管道 yaml - 当前的 .NET SDK 不支持针对 .NET Standard 2.0
- python - 在numpy中索引多个范围
- angular - 角度类型'{域:字符串[]; }' 不可分配给类型 'string | 颜色'
- c# - 如何降级 Autorest 扩展 - 特别是 C# 扩展?