TYPO3 7.6 Бэкэнд-модуль для отображения значений из нескольких таблиц - PullRequest
0 голосов
/ 01 мая 2018

Я уже некоторое время борюсь, и я не могу найти никого, кто делал бы то же самое раньше.

Я создаю бэкэнд-модуль в TYPO3 7.6, который принадлежит расширению магазина. Расширение магазина с модулем бэкэнда было создано с помощью построителя расширений. В магазине представлены следующие три модели:

Товар (товары, которые можно заказать в магазине)

Заказ продукции (ссылка на клиента)

ProductsorderPosition (заказанный товар, заказанный объем и размер и ссылка на Productsorder)

Клиенты относятся к типу модели из другого расширения. Эти клиенты связаны с fe_users.

Теперь то, что я хочу сделать в своем бэкэнд-модуле, - это получить представление обо всех этих заказах, перечисленных клиентом, некоторую информацию о fe_user и, конечно же, о продукте. Я создал sql-запрос, который делает именно это:

SELECT p.productname, p.productpriceperpiece,
    pop.amount, pop.size,
    h.name, h.address, h.zipcode, h.city, h.email, h.phone,
    f.first_name, f.last_name, f.email

    FROM `tx_gipdshop_domain_model_productorderposition` AS pop

    JOIN `tx_gipdshop_domain_model_product` AS p ON pop.products = p.uid
    JOIN `tx_gipdshop_domain_model_productsorder` AS po ON pop.productorder = po.uid
    JOIN `tx_gipleasedisturbhotels_domain_model_hotel` AS h ON po.hotel = h.uid
    JOIN `fe_users` AS f ON h.feuser = f.uid

Если я использую этот запрос из репозитория продукта, он возвращает правильное количество записей данных, но они относятся к типу product и все продукты "пустые" (uid = 0 и т. Д.).

Я добавил дополнительное действие для этого в контроллере продукта (getOrdersAction) и в репозитории, содержащем запрос, я добавил метод findAllOrders.

Я все еще новичок в TYPO3, но я могу каким-то образом понять, почему он возвращает наборы данных типа Product, когда запрос вызывается из ProductRepository. Но я не знаю, как я могу получить всю информацию из вышеприведенного запроса и вывести ее в бэкэнд-модуль.

Я уже думал о перемещении запроса в репозиторий ProductsorderPositionRepository, но, вероятно, столкнулся бы с аналогичной проблемой, он будет возвращать только информацию из ProductsorderPosition, а все остальное будет пропущено.

Может ли кто-нибудь указать мне правильное направление? Нужно ли создавать другую модель с отдельным хранилищем и контроллером? Нет ли более легкого пути?

Если вам нужна дополнительная информация, просто спросите! ;)

1 Ответ

0 голосов
/ 01 мая 2018

Прежде всего, вы делаете объединенный запрос с подмножествами данных, смешанными из нескольких таблиц. Против этого ничего нет.

Из-за этого не существует «модели» со смешанными наборами данных. Если вы используете объект запроса по умолчанию в хранилище, магия позади хранилища предполагает, что результат оператора запроса отражает определенную базовую модель для этого хранилища.

Перемещение функции запроса в другой репозиторий не решает проблему.

Вы не предоставили фрагмент кода, который выполняете оператор sql, поэтому я предполагаю, что вы использовали запрос в репозитории для выполнения оператора. Примерно так:

$result = $query->statement('
SELECT p.productname, p.productpriceperpiece,
pop.amount, pop.size,
h.name, h.address, h.zipcode, h.city, h.email, h.phone,
f.first_name, f.last_name, f.email

FROM `tx_gipdshop_domain_model_productorderposition` AS pop

JOIN `tx_gipdshop_domain_model_product` AS p ON pop.products = p.uid
JOIN `tx_gipdshop_domain_model_productsorder` AS po ON pop.productorder = po.uid
JOIN `tx_gipleasedisturbhotels_domain_model_hotel` AS h ON po.hotel = h.uid
JOIN `fe_users` AS f ON h.feuser = f.uid', NULL);

или использовали материал для построения запросов.

Первое решение

Первое и самое простое решение - получить результат в виде простого php-массива. До TYPO3 7.0 вы могли бы сделать это, используя это:

$query->getQuerySettings()->setReturnRawQueryResult(TRUE);

В TYPO3 7.0 этот устаревший метод был удален из ядра. Единственный способ - определить запрос и сейчас вызвать $query->execute(TRUE);.

Это должно вернуть данные в виде чистого массива.

Это самый простой вариант, но, поскольку мы находимся в контексте extbase, этого не должно быть достаточно.

Второе решение - нет, просто идея, которую я бы попробовал в следующем

Второе решение означает, что у вас есть какая-то работа, и на данный момент это только предложение, потому что я не пробовал это сам.

  1. Создание модели со свойствами и получателями / установщиками для столбцов результатов вашего запроса
  2. Создать соответствующий репозиторий

Третий раствор

Не приятно, но если ничего не работает, вернитесь к старым методам запроса TYPO3 v4:

$GLOBALS['TYPO3_DB']->exec_SELECTgetRows([...]))

и замените его на QueryBuilder в / для TYPO3 v8.

Это действительно нехорошо.

Надеюсь, я смогу направить вас в правильном направлении, даже если не дал полного решения проблемы.

...