TYPO3 v9:如何查询其他外部数据库(MSSQL)

TYPO3 v9:如何查询其他外部数据库(MSSQL),typo3,extbase,typo3-9.x,Typo3,Extbase,Typo3 9.x,我试图在我的一个存储库中查询额外的外部数据库连接。在LocalConfiguration.php中,我定义了两个连接(Default,External) 在我的存储库中,我想查询外部数据库(通过条令) 我是否必须明确告诉QueryBuilder使用该特定连接?现在,当系统试图通过默认连接连接时,我收到一个原则\DBAL\Exception\ConnectionException错误 An exception occurred while executing 'SELECT * FROM `dbo

我试图在我的一个存储库中查询额外的外部数据库连接。在
LocalConfiguration.php
中,我定义了两个连接(
Default
External

在我的存储库中,我想查询外部数据库(通过条令)

我是否必须明确告诉QueryBuilder使用该特定连接?现在,当系统试图通过
默认连接连接时,我收到一个
原则\DBAL\Exception\ConnectionException
错误

An exception occurred while executing 'SELECT * FROM `dbo`.`SomeTable`':
SELECT command denied to user 'myLocalUser'@'localhost' for table 'SomeTable'

查看
$GLOBALS['TYPO3_CONF_VARS']['DB']['TableMapping']
,您可以在其中明确定义哪些表位于哪个数据库中。有关更多详细信息,请参见此

另一个选项实际上是使用按名称询问连接,并由此创建查询生成器

GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionByName('External')->createQueryBuilder(…)


我个人会选择后者,因为它在实际调用方代码中更加明确使用了什么。

查看
$GLOBALS['TYPO3\u CONF\u VARS']['DB']['TableMapping']
,您可以在其中明确定义哪些表位于哪个数据库中。有关更多详细信息,请参见此

另一个选项实际上是使用按名称询问连接,并由此创建查询生成器

GeneralUtility::makeInstance(ConnectionPool::class)->getConnectionByName('External')->createQueryBuilder(…)


我个人会选择后者,因为在实际调用方代码中使用的内容更为明确。

要使用外部数据库,您必须:

  • 在LocalConfiguration.php中使用外部数据库和表映射配置映射
  • 在myExt/Configuration/TCA/MyExternalTableName.php中定义外部表的TCA
  • 在ext_typoscript_setup.txt中配置外部表/列映射
然后,存储库中的查询就可以工作了

示例LocalConfiguration.php:

'DB' => [
    'Connections' => [
        'Default' => [
            'charset' => 'utf8',
            'dbname' => 'LOCAL-DB',
            'driver' => 'mysqli',
            'host' => '127.0.0.1',
            'password' => 'PWD',
            'port' => 3306,
            'user' => 'USER',
        ],
        'externalDb' => [
            'charset' => 'utf8',
            'dbname' => 'EXTERNAL-DB',
            'driver' => 'mysqli',
            'host' => 'localhost',
            'password' => 'PWD',
            'port' => 3306,
            'user' => 'USER',
        ],
    ],
    'TableMapping' => [
        'MyexternalTable1' => 'externalDb',
        'MyexternalTable2' => 'externalDb',
        ...
    ]
]
myExt/ext\u typoscript\u setup.txt中的示例列映射:

plugin.tx_myext {
    persistence {
        classes {
            Vendor\MyExt\Domain\Model\LocalModel {
                mapping {
                    tableName = ExternalTableName
                    recordType = \Vendor\MyExt\Domain\Model\LocalModel
                    columns {
                        col1.mapOnProperty = uid
                        col2.mapOnProperty = name
                        ...
                    }
                }
            }
        }
    }
}

要使用外部数据库,您必须:

  • 在LocalConfiguration.php中使用外部数据库和表映射配置映射
  • 在myExt/Configuration/TCA/MyExternalTableName.php中定义外部表的TCA
  • 在ext_typoscript_setup.txt中配置外部表/列映射
然后,存储库中的查询就可以工作了

示例LocalConfiguration.php:

'DB' => [
    'Connections' => [
        'Default' => [
            'charset' => 'utf8',
            'dbname' => 'LOCAL-DB',
            'driver' => 'mysqli',
            'host' => '127.0.0.1',
            'password' => 'PWD',
            'port' => 3306,
            'user' => 'USER',
        ],
        'externalDb' => [
            'charset' => 'utf8',
            'dbname' => 'EXTERNAL-DB',
            'driver' => 'mysqli',
            'host' => 'localhost',
            'password' => 'PWD',
            'port' => 3306,
            'user' => 'USER',
        ],
    ],
    'TableMapping' => [
        'MyexternalTable1' => 'externalDb',
        'MyexternalTable2' => 'externalDb',
        ...
    ]
]
myExt/ext\u typoscript\u setup.txt中的示例列映射:

plugin.tx_myext {
    persistence {
        classes {
            Vendor\MyExt\Domain\Model\LocalModel {
                mapping {
                    tableName = ExternalTableName
                    recordType = \Vendor\MyExt\Domain\Model\LocalModel
                    columns {
                        col1.mapOnProperty = uid
                        col2.mapOnProperty = name
                        ...
                    }
                }
            }
        }
    }
}

很好,这很有效(我正在使用
getConnectionByName
)–非常感谢!getConnectionByName对我来说是一个非常有用的提示,谢谢:-)我如何将getRestrictions与getConnectionByName一起使用?太好了,这很有效(我正在使用
getConnectionByName
)–非常感谢!getConnectionByName对我来说是一个非常有用的提示,谢谢:-)如何将getRestrictions与getConnectionByName一起使用?