根据日期返回一个功能

问题描述 投票:1回答:1

我在silverstripe中创建了一个页面(TheatrePage),其中包含开始日期和完成日期(Theatrepages是TheatreHolder的子节点)

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

我需要在另一页中浏览这些剧院的第一周和上周。 (例如剧院StartDate = 2018,11,01&FinishDate = 2019,03,15如果今天= 2018,11,05{$Now}在FirstWeekPage中循环,如果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');
        }
    }

}
php function silverstripe silverstripe-4
1个回答
1
投票

你的剧院课如下:

class Theatre extends Page
{

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

    private static $default_sort = 'StartDate ASC';

}

如果你想要获得所有剧院页面,你必须运行

Teatre::get();

这将返回所有剧院页面,按“StartDate ASC”排序,因为我在课堂上将其定义为default_sort。清洁代码总是好的;)

现在你想要获得本周开始的所有剧院页面。 SQL qazxsw poi不能被MySQL缓存,因此我们手动计算它。

为了计算日期,我们可以使用NOW()

PHP's built in DateTime class

MySQL格式要我以$today = new DateTime('today'); // set time to midnight $today = $today->setTime(0, 0); 格式查询,所以让我们创建字符串:

YYYY-MM-DD HH:MM:SS

现在我们可以通过过滤今天午夜StartDate大于或等于的所有事件来获取今天开始的所有事件:

$todayString = $today->format('Y-m-d H:i:s');

接下来,我们计算一周中的日期字符串。因此,我们将今天的DateTime对象添加7天:添加一周的DateInterval对象:

$allTheatres = Theatre::get()->filter(['StartDate:GreaterThanOrEqual' => $todayString]);

但我们希望包括整天,所以如果它从23:00开始我们仍然希望它包括在内,因此我们将时间设置为午夜前一分钟:

$inAWeek = $today->add(DateInterval::createFromDateString('1 week');

并为查询生成字符串:

$inAWeek = $inAWeek->setTime(23,59);

现在就可以获得今天和一周之内的所有影院。从数据库的角度来看,我们需要所有数据集,其中开始日期大于今天,同时开始日期小于一周。使用SilverStripe的ORM,我们可以使用$inAWeekString = $inAWeek->format('Y-m-d H:i:s'); 这样过滤:

search filter modifiers

同样适用于结束日期。

现在我们希望所有剧院要么本周开始,要么本周结束。对于$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, ], ]); ,而不是实际结果,您可以稍后在模板或其他方法中对其进行优化。

© www.soinside.com 2019 - 2024. All rights reserved.