Вернуть функцию по дате - PullRequest
0 голосов
/ 18 февраля 2019

Я создал страницу (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 голосов
/ 22 февраля 2019

Ваш класс Тэтре такой:

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 класс DateTime :

$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');

Теперь получим все Театры, которые находятся между сегодняшним днем ​​И через неделю,С точки зрения базы данных нам нужны все наборы данных, где дата начала больше, чем сегодня, и в то же время дата начала меньше, чем через неделю.С ORM SilverStripe мы можем фильтровать следующим образом, используя модификаторы поискового фильтра :

$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, а не фактические результаты, и вы можете уточнить его позже в своемшаблон или другой метод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...