extbase如何在下面切换数据库

时间:2015-12-03 16:40:10

标签: extbase typo3-7.x

我们有一个使用2015年数据的扩展程序。2016年将有相同的游戏,没有结构变化。在扩展中我希望有一个开关来改变数据库extbase从中获取数据。

任何输入如何实现这一目标?

谢谢。

2 个答案:

答案 0 :(得分:2)

之前给出的关于“使用外部数据源”的答案仅解决了同一数据库中的映射方面,也解决了单表继承方面作为域驱动设计上下文中对象关系映射的变体。

如果想要使用不同的数据库连接甚至不同的DBMS,给定的Extbase场景有三种可能性。

  1. 使用允许配置其他连接的数据库抽象层

    • 直到TYPO3 CMS 7,您必须安装系统扩展dbal configure 替代连接并在源代码中使用它 - 请参阅 DBAL documentation了解详细信息 - 使用a时会出现问题 不同的DBMS,如Oracle或PostgreSQL,但如果两者都可以正常工作 数据库基于MySQL(或MariaDB)
    • 使用TYPO3 CMS 8,您可以使用允许的Doctrine DBAL 为每个数据库表配置不同的连接。如果是的名字 table在两个数据库中都是一样的,你需要获取Connection object,代表第二个数据库单独使用 ConnectionPool - 请参阅TYPO3 documentation on Doctrine DBAL 细节
  2. 使用名称与第二个数据库不同的VIEW

    • 在基础架构级别创建VIEW并提供表格 当前数据库中的一个不同的表名 - 这是一种 解决方法,但确保在第二个表中修改表 数据库自动反映在数据库VIEW
    • 使用上一篇文章中提到的TypoScript映射 将您的域模型连接到具有不同名称
    • 的数据库VIEW
  3. 作为最后的手段重载课程Typo3DbBackend

    • 此类负责实际执行数据库查询 Extbase应用程序上下文
    • 您可以将策略模式集成到使用 默认实现或使用自定义第二个数据库连接 可以通过ext_localconf.php来定义重载,例如

      $extbaseObjectContainer = \TYPO3\CMS\Core\Utility\GeneralUtility::makeInstance(\TYPO3\CMS\Extbase\Object\Container\Container::class);
      $extbaseObjectContainer->registerImplementation(\TYPO3\CMS\Extbase\Persistence\Generic\Storage\BackendInterface::class, \TYPO3\CMS\Extbase\Persistence\Generic\Storage\Typo3DbBackend::class);
      

答案 1 :(得分:0)

根据惯例,可以将模型映射到除模型名称派生的表之外的其他表。

示例:

plugin.tx_myextension {
    persistence {
        classes {
            Tx_MyExtension_Domain_Model_Person {
                mapping {
                    tableName = tt_address
                    recordType = Tx_MyExtension_Domain_Model_Person
                    columns {
                        birthday.mapOnProperty = dateOfBirth
                        street.mapOnProperty = thoroughfare
                    }
                }
            }
        }
    }
}

如果您只想切换表格,可以省略示例中的列映射。

可在文档中找到更多信息: https://docs.typo3.org/typo3cms/ExtbaseFluidBook/6-Persistence/4-use-foreign-data-sources.html