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