Php 根据日期返回函数

Php 根据日期返回函数,php,function,silverstripe,silverstripe-4,Php,Function,Silverstripe,Silverstripe 4,我在silverstripe中创建了一个页面(TheaterPage),其中包含开始日期和完成日期(TheaterPage是TheaterHolder的子页面) 我需要在另一页中循环浏览这些剧院的第一周和最后一周。 (例如,剧院开始日期=2018,11,01和结束日期=2019,03,15 如果今天=2018,11,05{$Now}在第一周页面中循环,如果今天{$Now}=2019,03,12在最后一周页面中显示) 您的课程如下所示: class Theatre extends Page {

我在silverstripe中创建了一个页面(TheaterPage),其中包含开始日期和完成日期(TheaterPage是TheaterHolder的子页面)

我需要在另一页中循环浏览这些剧院的第一周和最后一周。 (例如,剧院开始日期=2018,11,01和结束日期=2019,03,15 如果今天=2018,11,05
{$Now}
在第一周页面中循环,如果今天
{$Now}
=2019,03,12在最后一周页面中显示)


您的课程如下所示:

class Theatre extends Page
{

    private static $db = [
            'StartDate' => 'Date',
            'FinishDate' => 'Date',
    ];

    private static $default_sort = 'StartDate ASC';

}
如果你想得到所有的戏剧页面,你必须运行

Teatre::get();
这将返回所有剧院页面,按“StartDate ASC”排序,因为我在类中将其定义为
default\u sort
。更干净的代码总是好的;)

现在,您希望获得本周开始的所有剧院页面。SQL
NOW()
不能被MySQL缓存,因此我们手动计算

对于使用日期进行计算,我们可以使用:

MySQL格式希望我以
YYYY-MM-DD HH:MM:SS
的格式进行查询,因此让我们创建以下字符串:

$todayString = $today->format('Y-m-d H:i:s');
现在,我们可以通过过滤StartDate大于或等于今天午夜的所有事件来获取今天开始的所有事件:

$allTheatres = Theatre::get()->filter(['StartDate:GreaterThanOrEqual' => $todayString]);
$inAWeek = $inAWeek->setTime(23,59);
接下来,我们计算一周内的日期字符串。因此,我们向今天的DateTime对象添加7天:添加一个一周的DateInterval对象:

$inAWeek = $today->add(DateInterval::createFromDateString('1 week');
但是我们想要包括一整天,所以如果它在23:00开始,我们仍然想要包括它,因此让我们将时间设置为午夜前一分钟:

$allTheatres = Theatre::get()->filter(['StartDate:GreaterThanOrEqual' => $todayString]);
$inAWeek = $inAWeek->setTime(23,59);
并为查询生成字符串:

$inAWeekString = $inAWeek->format('Y-m-d H:i:s');
现在去看看今天和一周内所有的剧院。从数据库的角度来看,我们需要所有数据集,其中开始日期大于今天,同时开始日期小于一周。使用SilverStripe的ORM,我们可以使用以下方法进行如下筛选:

对于结束日期也是如此

现在我们想要所有的剧院,要么本周开始,要么本周结束。对于
过滤,我们需要使用


注意:这将返回一个
数据列表
,而不是实际结果,您可以稍后在模板或其他方法中对其进行细化。

您可以分享您迄今为止的尝试吗?您可以在我上次编辑中看到我的示例。因此,您希望所有剧院的开始和结束日期都与接下来的七天重叠吗?
$inAWeekString = $inAWeek->format('Y-m-d H:i:s');
$allTheatresStartingThisWeek = Theatre::get()->filter([
    'StartDate:GreaterThanOrEqual' => $todayString,
    'StartDate:LessThanOrEqual' => $inAWeekString,
]);
$allTheatresThisWeek = Theatre::get()->filterAny([
    [
    'StartDate:GreaterThanOrEqual' => $todayString,
    'StartDate:LessThanOrEqual' => $inAWeekString,
    ],
    [
    'EndDate:GreaterThanOrEqual' => $todayString,
    'EndDate:LessThanOrEqual' => $inAWeekString,
    ],
]);