【问题标题】:Return a function according to the date根据日期返回一个函数
【发布时间】:2019-02-18 07:32:30
【问题描述】:

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

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

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

}

【问题讨论】:

  • 你能分享一下你到目前为止的尝试吗?
  • 你可以在我上次的编辑中看到我的例子。
  • 所以您想获取所有开始日期和结束日期重叠在接下来的 7 天的影院吗?

标签: php function silverstripe silverstripe-4


【解决方案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。更简洁的代码总是好的 ;)

现在您想获取本周开始的所有剧院页面。 SQLNOW()不能被MySQL缓存,所以我们手动计算。

为了计算日期,我们可以使用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]);

接下来我们计算一周的日期字符串。因此我们给今天的 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,我们可以像这样过滤,使用 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,而不是实际结果,您可以稍后在模板或其他方法中对其进行优化。

【讨论】:

    猜你喜欢
    • 2020-08-15
    • 1970-01-01
    • 2020-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-08
    • 1970-01-01
    相关资源
    最近更新 更多