Проблема
Существует Расширение, назовем его ProjectExams, которое показывает список экзаменов.Существует структура с контроллером, моделью, репозиторием моделей, таблицами и шаблоном.Все работает, используя Extbase для извлечения коллекций данных (привязки отложенной загрузки моделей).
У нас есть два запроса:
* обход привязок и извлечение коллекции с использованием только одного «необработанного» SQL-запроса с объединениями вDB;
* вернуть в View (Template) массив без элементов объектов
Фон и код
Коллекция моделей представляет список экзаменов.Помимо UID, Title, Description и остальных полей, которые находятся в таблице MySQL «domain_model_exams», файл шаблона должен также указывать местоположение (город) для каждого экзамена.Затем ModelRepository использует метод «findExamsByDate», вызываемый контроллером, в котором запрашивается реализация этого единственного «необработанного» SQL-запроса.
Код контроллера
public function listAction($success = null, $message = '')
{
// here some code, not related to the issue
$examStartFrom = $_POST['exams']['examStartFrom'] ?? null;
$examStartTo = $_POST['exams']['examStartTo'] ?? null;
$dateBoundary = new DateBoundary($examStartFrom, $examStartTo);
$isAdmin = ($role === User::USER_TYPES_EXAMINER_ADMIN && $dateBoundary->isValid());
$exams = $this->examRepository->findExamsByDate(
$dateBoundary->getFromDate(),
$dateBoundary->getToDate(),
$isAdmin
);
// here some code, not related to the issue
$this->view->assign('exams', $exams);
// here some code, not related to the issue
}
Шаблон (просмотр) ожидает переменную exams.city
В *Файл 1023 * Model , у нас есть защищенный var $city
с функциями set и get
ModelRepository code
/**
* Get all exams within a certain time frame
*
* @param \DateTime $from
* @param \DateTime $to
* @param bool $isAdmin
*
* @return QueryResultInterface|array|Exam[]
*
* @throws \TYPO3\CMS\Extbase\Persistence\Exception\InvalidQueryException
*/
public function findExamsByDate(\DateTime $from, \DateTime $to, bool $isAdmin = false)
{
$whereConditions = [];
$query = $this->createQuery();
// here some lines with where conditions related to time frame
if ($from instanceof \DateTime) {
$whereConditions[] = 's.course_start >= ' . $from->getTimestamp();
}
if ($to instanceof \DateTime) {
$whereConditions[] = 's.course_start <= ' . $to->getTimestamp();
}
$query->statement(sprintf('
SELECT s.*, a.place as city
FROM domain_model_exams AS s
LEFT JOIN domain_model_address AS a ON s.address_id = a.uid
WHERE %1$s
ORDER BY s.course_start ASC
', implode(' AND ', $whereConditions)));
return $query->execute();
}
Results
Используя \TYPO3\CMS\Extbase\Utility\DebuggerUtility::var_dump($exams);
, мы получаем этот объект:
TYPO3\CMS\Extbase\Persistence\Generic\QueryResultprototypeobject (762 items)
0 => Domain\Model\Examprototypepersistent entity (uid=5, pid=568)
title => protected 'The mighty title for this exam' (xx chars)
descriptionText => protected '' (0 chars)
courseStart => protectedDateTimeprototypeobject (2014-12-05T09:00:00+00:00, 1417770000)
courseEnd => protectedDateTimeprototypeobject (2014-12-07T11:30:00+00:00, 1417951800)
.
. other fields
.
city => protected NULL
.
. other fields
.
Мы ожидаем, что city => protected 'Frankfurt am Main' (17 chars)
не NULL
, потому что мы получаем это, когда SQL-запрос выполняется к базе данных.