问题描述
由于 TYPO3 使用了学说,因此可以在一个实例中使用来自多个数据库的表(有一些限制,例如没有 joins
)。
但是有什么可能呢?
目前我需要两个外部表进行扩展,我没有直接使用它们,而是像往常一样导入它们以在本地工作。但是导入有一些缺点。
退让我可以接受:
- 数据无效(稍后导入对外部表的更改)
- 数据是只读的(无论如何更改都是在外部完成的)
对于导入,我使用 ext:external_import
但存在一些问题,因为不是所有数据都可以在一次运行中导入,然后出现错误(例如有关于重复键的报告,唉外部表)
另一方面,我怀疑我是否可以直接使用外部表,因为它们没有通常的 TYPO3 结构(字段:'uid'、'pid'、'tstamp'、...)。 (也许它们可以在视图中映射?)(当然在我将数据导入这些字段的表中存在)
此外,外部更改可能不会被注意到,缓存内容也不会反映当前数据。在我的情况下,这将是一个小问题,因为我们目前已经没有“实时”数据,但是需要定期清理缓存和搜索索引 (solr)。
有哪些可能的解决方案? ? (它们是否依赖于 TYPO3 版本?) 你有什么体验?
编辑:
考虑到给定的答案试图实现它时,更多的疑问出现了:
- 表是只读的(因为它们是从外部更改的):
我如何向 TYPO3 申报? - 表不遵循通常的命名规则,特别是一个表命名为
sys_category
,这样就与TYPO3表sys_category
发生冲突。
我可以在 TYPO3 内部构建映射吗? - 我可以从 TYPO3 构建视图以重命名表和字段吗?
喜欢:
CREATE View tx_myext_category
SELECT id as uid,name as title,...
FROM databasename.sys_category;
解决方法
是的,您可以直接从其他数据库/表中获取数据。当然,这在很大程度上取决于用例和您获得的数据:
- 使用 queryBuilder 和您从 https://docs.typo3.org/m/typo3/reference-coreapi/master/en-us/ApiOverview/Database/Index.html 了解的所有 API(例如 ConnectionPool、QueryBuilder)可以很好地读取/写入数据
- 如果你想在表单引擎中显示数据,例如list 模块,您还需要拥有最少的列,例如 uid、pid 和有效的 TCA。
根据我的经验,映射机制仅在外部表具有与 TYPO3 表几乎相似的结构时才有效。外部至少需要一个 uid
字段。这是无法映射的!如果需要,可以在 TYPO3 端管理缺少的 pid
字段,也可以使用 crdate
或 tstamp
。只需用 TYPO3 需要的值填充本地数据数组即可。
如果你有关系要处理,就会出现问题。许多外部系统有其他方式来处理关系。如果您尝试仅依赖映射机制,可能会遇到很多问题。
其他问题是日期格式的字段。 MS 世界中的大多数外部表使用另一种格式作为 unixtime。
如果您遇到映射机制的问题,您可以切换到 TYPO3 queryBuilder。这是一个强大的回退。我只遇到了一种特殊类型的 JOIN 语句的问题。
但是有了 TYPO3 queryBuilder,您就靠自己了。您将 queryBuilder 代码的实例放置在存储库中,并像往常一样添加模型代码:这样您就可以像往常一样继续在前端使用 Fluid。
回答编辑:
- 使用 TYPO3 queryBuilder 只读表不是问题。只是不要在您的模型中实现 setter 类。
- 使用 TYPO3 queryBuilder,您可以使用任何名称调用任何外部表。您可以完全控制存储库中的输出数据,因为映射是在其中处理的。
- 据我所知,没有办法在 TYPO3 到 v9 中创建 SQL 视图,无论是 DBAL 映射机制还是 TYPO3。查询构建器。