如何使用 cakephp3 在查询中使用不同的数据源?

How to use different datasources in a Query using cakephp3?

我正在开发一个 cakePHP3 项目,它有 3 个不同的数据源。我有一个主模型,称为应用程序,它应该有两个 hasOne() 关联到两个具有不同数据源的模型作为模型应用程序。我已经创建了两个模型并使用 defaultConnectionName().

将两个模型表指向它们的数据源

现在,我向我的 ApplicationsTable 对象添加了两个 hasOne() 关系,并在尝试 Applications->get() 时收到 sql 错误。这很清楚,因为在 SQL 声明中他们没有在 FROM 和 JOIN 部分声明数据源,例如 SELECT * FROM datasource1.myTable

我查看了 cakephp 框架 ORM/Query class 并且查询对象似乎只有一个数据源连接作为 class 属性。

有没有办法在使用 cake ORM 的数据检索中使用不同的数据源,或者我应该在这里使用自定义查询?

提前致谢!

目前,CakePHP 在创建连接时不考虑数据源配置,而且我不认为这会在不久的将来添加,尤其是因为不支持跨数据库连接"out of the box"(例如,只需在数据库名称前添加数据库名称即可)在 Postgres and SQLite.

假设您正在使用支持跨数据库连接的 DBMS,您可以做的是更改使用的 table 名称以也包含数据库名称,即 databaseName.tableName 而不仅仅是 tableName

public function initialize(array $config)
{
    $this->table('databaseName.tableName');
    // ...
}

或动态

$this->table($this->connection()->config()['database'] . '.tableName');

SQLite

对于 SQLite,您可以使用 ATTACH DATABASE statement 轻松地完成这项工作,如上面的链接答案所示。在您的 CakePHP 应用程序中,您可以在 bootstrap 或任何需要 id 的地方发出此语句,例如

use Cake\Datasource\ConnectionManager;

// ...

/* @var $connection \Cake\Database\Connection */
$connection = ConnectionManager::get('default');
$connection->execute('ATTACH DATABASE "db2.sqlite3" AS databaseName');

这将附加数据库 db2.sqlite3,架构名称为 databaseName。从那时起,上面提到的 table 名称解决方案应该可以正常工作,至少是非动态名称解决方案,因为动态名称解决方案会使用类似 db2.sqlite3 的名称作为模式名称,这是行不通的。

Postgres

我不习惯 Postgres,所以此时我不能给你一个例子,但它应该可以类似地使用 foreign data wrappers,即最初发出正确的语句,然后参考到指定的架构名称。