#typo3 #external-tables
Вопрос:
Поскольку TYPO3 использует доктрину, можно использовать таблицы из нескольких баз данных в одном экземпляре (с некоторыми ограничениями, например, без joins
).
Но что вообще возможно?
На данный момент мне нужны две внешние таблицы для расширения, и вместо того, чтобы использовать их напрямую, я импортирую их для работы локально, как обычно. Но у импорта есть некоторые недостатки.
Отступление я могу принять:
- данные не являются живыми (изменения во внешних таблицах будут импортированы позже)
- данные доступны только для чтения (изменения все равно вносятся извне).
Для импорта я использую ext:external_import
, но есть некоторые проблемы, так как не все данные могут быть импортированы за один запуск, а затем возникают ошибки (например, появляются отчеты о дубликатах ключей, увы, дубликатов ключей во внешних таблицах нет).
С другой стороны, я сомневаюсь, что смогу напрямую использовать внешние таблицы, поскольку они не имеют обычной структуры TYPO3 (поля: ‘uid’, ‘pid’, ‘tstamp’,…). (Может быть, их можно отобразить в представлении?) (конечно, в таблицах, которые я импортирую, данные в эти поля существуют)
Кроме того, внешние изменения могут остаться незамеченными, а кэшированное содержимое не отражает текущие данные. В моем случае это было бы незначительной проблемой, так как в настоящее время у нас уже нет «живых» данных, но их необходимо регулярно очищать для кэша и для поискового индекса (solr).
Каковы возможные решения? ? (зависят ли они от версии TYPO3?) Каковы ваши впечатления?
Редактировать:
При попытке осознать это с учетом данных ответов появляется все больше сомнений:
- таблицы доступны только для чтения (по мере их изменения извне):
Как мне объявить об этом в TYPO3? - таблицы не соответствуют обычным правилам именования, особенно одна таблица имеет имя
sys_category
, которое таким образом конфликтует с таблицей TYPO3sys_category
.
Могу ли я построить отображение внутри TYPO3? - Могу ли я создать представление из TYPO3 для переименования таблиц и полей?
Нравится:
CREATE View tx_myext_category
SELECT id as uid, name as title, ...
FROM databasename.sys_category;
Ответ №1:
Да, вы можете получать данные непосредственно из других баз данных/таблиц. Конечно, это сильно зависит от способов использования и данных, которые вы получаете:
- Он отлично работает для чтения/записи данных с помощью QueryBuilder и всех известных вам API https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Database/Index.html например, ConnectionPool, QueryBuilder
- Если вы хотите отобразить данные в formengine, например, в модуле списка, вам также понадобятся минимальные столбцы, такие как uid, pid и допустимый TCA.
Комментарии:
1. Представительство в BE не обязательно. все данные должны быть указаны в FE. в виде списка и подробном представлении. данные в первой таблице представляют собой дерево (родительский указатель), и каждая запись второй таблицы назначается одной записи в первой таблице.
2. Насколько я понимаю, разделение по крайней мере по столбцам
uid
иpid
должно существовать. нет другого выхода?3. Это действительно зависит от обстоятельств. если вы используете репозиторий extbase, вам понадобится tca и эти поля. если вы просто сделаете необработанные запросы и выведете их в жидком виде, все будет хорошо
4. появятся дополнительные вопросы: см. раздел редактирование в вопросе
Ответ №2:
По моему опыту, механизм сопоставления работает только в том случае, если внешняя таблица имеет почти такую же структуру, как таблицы TYPO3. Вам нужно, по крайней мере uid
, поле с внешней стороны. Это невозможно отобразить на карте! Отсутствующим pid
полем также можно управлять со стороны TYPO3 crdate
или tstamp
при необходимости. Просто заполните локальный массив данных значениями, необходимыми TYPO3.
Проблемы возникают, если вам приходится иметь дело с отношениями. У многих внешних систем есть другие способы управления отношениями. Вы можете столкнуться со многими проблемами, если попытаетесь полагаться только на механизм сопоставления.
Другие проблемы связаны с полями с форматом даты. Большинство внешних таблиц в мире MS используют другой формат в качестве unixtime.
Если у вас возникнут проблемы с механизмом сопоставления, вы можете переключиться на сборщик запросов TYPO3. Это мощный запасной вариант. Я испытывал проблемы только с особым типом операторов СОЕДИНЕНИЯ.
Но с помощью сборщика запросов TYPO3 вы предоставлены сами себе. Вы размещаете экземпляры кода QueryBuilder в репозитории и добавляете свой код модели, как обычно: таким образом, вы можете продолжать работать с Fluid во внешнем интерфейсе, как вы привыкли.
ОТВЕТ НА РЕДАКТИРОВАНИЕ:
- С помощью TYPO3 QueryBuilder таблицы только для чтения не являются проблемой. Просто не внедряйте классы сеттеров в свои модели.
- С помощью TYPO3 QueryBuilder вы можете вызывать любую внешнюю таблицу с любым именем. У вас есть полный контроль над выходными данными в вашем репозитории, потому что сопоставление обрабатывается внутри него.
- Насколько я знаю, нет никакого способа создать представления SQL в TYPO3 до версии 9, ни с помощью механизма сопоставления DBAL, ни с помощью TYPO3. Конструктор запросов.
Комментарии:
1. появятся дополнительные вопросы: см. раздел редактирование в вопросе