【发布时间】:2015-12-03 16:40:10
【问题描述】:
我们有一个使用 2015 年数据的扩展程序。2016 年将有同样的游戏,没有结构变化。在扩展中,我希望有一个开关来更改数据库 extbase 从中获取数据。
任何输入如何实现这一点?
谢谢。
【问题讨论】:
我们有一个使用 2015 年数据的扩展程序。2016 年将有同样的游戏,没有结构变化。在扩展中,我希望有一个开关来更改数据库 extbase 从中获取数据。
任何输入如何实现这一点?
谢谢。
【问题讨论】:
前面给出的关于“使用外部数据源”的答案只是解决了同一数据库内的映射方面,以及作为域驱动设计上下文中对象关系映射的变体的单表继承。
如果想使用不同的数据库连接甚至不同的 DBMS,给定的 Extbase 场景有三种可能性。
使用允许配置额外连接的数据库抽象层
dbal配置
替代连接并在您的源代码中使用它 - 请参阅
DBAL documentation 了解详情 - 如果使用
不同的 DBMS,如 Oracle 或 PostgreSQL,但如果两者都可以正常工作
数据库基于 MySQL(或 MariaDB)Connection
对象,分别使用
ConnectionPool - 见TYPO3 documentation on Doctrine DBAL
详情使用与第二个数据库不同名称的VIEW
VIEW 并为表提供
当前数据库中的不同表名 - 这是一种
解决方法,但确保在您的第二次修改表
数据库自动反映在数据库VIEW
VIEW
重载类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);
【讨论】:
除了按照惯例从模型名称派生的表之外,还可以将模型映射到其他表。
例子:
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
【讨论】: