在TYPO3中包含外部表的可能方法

问题描述

由于 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;

解决方法

是的,您可以直接从其他数据库/表中获取数据。当然,这在很大程度上取决于用例和您获得的数据:

,

根据我的经验,映射机制仅在外部表具有与 TYPO3 表几乎相似的结构时才有效。外部至少需要一个 uid 字段。这是无法映射的!如果需要,可以在 TYPO3 端管理缺少的 pid 字段,也可以使用 crdatetstamp。只需用 TYPO3 需要的值填充本地数据数组即可。

如果你有关系要处理,就会出现问题。许多外部系统有其他方式来处理关系。如果您尝试仅依赖映射机制,可能会遇到很多问题。

其他问题是日期格式的字段。 MS 世界中的大多数外部表使用另一种格式作为 unixtime。

如果您遇到映射机制的问题,您可以切换到 TYPO3 queryBuilder。这是一个强大的回退。我只遇到了一种特殊类型的 JOIN 语句的问题。

但是有了 TYPO3 queryBuilder,您就靠自己了。您将 queryBuilder 代码的实例放置在存储库中,并像往常一样添加模型代码:这样您就可以像往常一样继续在前端使用 Fluid。

回答编辑:

  • 使用 TYPO3 queryBuilder 只读表不是问题。只是不要在您的模型中实现 setter 类。
  • 使用 TYPO3 queryBuilder,您可以使用任何名称调用任何外部表。您可以完全控制存储库中的输出数据,因为映射是在其中处理的。
  • 据我所知,没有办法在 TYPO3 到 v9 中创建 SQL 视图,无论是 DBAL 映射机制还是 TYPO3。查询构建器。