根据日期返回函数

时间:2019-02-18 07:32:31

标签: php function silverstripe silverstripe-4

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

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

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

}

1 个答案:

答案 0 :(得分:1)

您的Thatre类就像:

class Theatre extends Page
{

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

    private static $default_sort = 'StartDate ASC';

}

如果要获取所有剧院页面,则必须运行

Teatre::get();

这将返回所有剧院页面,按“ StartDate ASC”排序,因为我在该类中将其定义为default_sort。干净的代码总是很好;)

现在,您要获得本周开始的所有剧院页面。 MySQL无法缓存SQL NOW(),因此我们手动进行计算。

要计算日期,可以使用PHP's built in DateTime class

$today = new DateTime('today');

// set time to midnight
$today = $today->setTime(0, 0);

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

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

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

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

接下来,我们计算一周中的日期字符串。因此,我们将7天添加到今天的DateTime对象中:添加一个为期一周的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,我们可以使用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,
    ],
]);

注意:这将返回DataList,而不是实际结果,您以后可以在模板或其他方法中对其进行优化。