4

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

现在我hasOne()向我的 ApplicationsTable 对象添加了两个关系,并在尝试Applications->get(). 这很清楚,因为在 SQL 语句中它们不是 FROM 和 JOIN 部分的数据源的任何说明,例如SELECT * FROM datasource1.myTable

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

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

提前致谢!

4

1 回答 1

8

目前,CakePHP 在创建连接时不考虑数据源配置,我认为这不会在不久的将来添加,尤其是因为“开箱即用”不支持跨数据库连接(如在,只需在PostgresSQLite中添加数据库名称即可。

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

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

或动态

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

SQLite

对于 SQLite,您可以使用ATTACH DATABASE语句轻松完成这项工作,如上面链接的答案所示。在你的 CakePHP 应用程序中,你可以在你的引导程序或任何你需要 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。从那里开始,上面提到的表名解决方案应该可以正常工作,至少是非动态的,因为动态的会使用类似于db2.sqlite3模式名称的东西,这是行不通的。

Postgres

我不习惯 Postgres,所以在这一点上我不能给你一个例子,但它可能应该使用外部数据包装器类似地工作,即最初发出正确的语句,然后只引用指定的模式名称。

于 2015-08-16T12:02:58.260 回答