如何使用 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,即最初发出正确的语句,然后参考到指定的架构名称。
我正在开发一个 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,即最初发出正确的语句,然后参考到指定的架构名称。