interval = $interval; /** @var DateTime[] $displayDates */ $displayDates = $interval->getAllDisplayDates(); $timeTable->weeks = []; /** @var DateTime $displayDate */ foreach ($displayDates as $displayDate) { $timeTableMonthDay = new TimeTableMonthDay(); $timeTableMonthDay->date = $displayDate; $timeTableMonthDay->active = $interval->isActive($displayDate); $timeTable->days[] = $timeTableMonthDay; $weekNumber = $displayDate->format('W'); if (!isset($timeTable->weeks[$weekNumber])) { $week = new TimeTableMonthWeek(); $week->weekNumber = $weekNumber; $timeTable->weeks[$weekNumber] = $week; } $weekDayName = strtolower($displayDate->format('l')); $timeTable->weeks[$weekNumber]->$weekDayName = $timeTableMonthDay; } // get events between active dates $query = Event::find(); $query = $query->select( [ '{{event}}.*', // 'COUNT({{event_registration}}.id) AS reservationCount' ]); $events = $query ->innerJoinWith('trainer') ->innerJoinWith('eventType') ->innerJoinWith('room') ->joinWith('activeEventRegistrations') ->andWhere(['>=', 'event.start', $interval->firstActiveDate->getTimestamp()]) ->andWhere(['<', 'event.start', (clone $interval->lastActiveDate)->modify('+1 day')->getTimestamp()]) ->andWhere(['event.active' => '1']) ->orderBy([ 'event.start' => SORT_ASC ]) ->all(); // set events per day /** @var Event $event */ foreach ($events as $event) { $eventDay = new DateTime(); $eventDay->setTimestamp($event->start); $eventDay->setTime(0, 0); foreach ($timeTable->days as $date) { if ($date->date == $eventDay) { $date->events[] = $event; break; } } } return $timeTable; } }