是否可以使用内置的 CakePHP 模型功能从另一个数据库中读取表?我并不是说在DATABASE_CONFIG
中具有完全不同的配置,而是使用相同的主机,用户名和密码。显而易见的事情:
class Provincia extends AppModel {
public $useTable = 'shared_data.dbo.provincia';
}
class DebugController extends AppController {
public function index() {
/* @var $modeloProvincia Provincia */
$modeloProvincia = ClassRegistry::init('Provincia');
$provincias = $modeloProvincia->find('all');
}
}
。触发器:
错误:在数据源默认值中找不到模型 Provincia 的表 shared_data.dbo.provincia。
到目前为止,我将分享我的发现...
简短的回答:你不能。
CakePHP 魔术在很大程度上依赖于从INFORMATION_SCHEMA
视图中获取的有关表和列的信息。该信息收集在Sqlserver::listSources
(表列表)和Sqlserver::describe
(列列表)中。
虽然可以扩展数据源驱动程序并重新实现这些方法:
// Model/Datasource/CustomSqlserver.php
class CustomSqlserver extends Sqlserver {
}
class DATABASE_CONFIG {
public $default = array(
'datasource' => 'CustomSqlserver',
// ...
);
}
。这只是冰山一角。数据结构占两个级别:
- 模式(例如
dbo
) - 表(例如
users
)
它们不是为顶部的额外数据库级别而设计的。因此,您最终需要修补太多代码,以至于不值得付出努力。
我也一直在SQL Server中使用同义词。这是一条更有前途的途径,因为虽然您仍然需要编写CustomSqlserver::listSources
并自己CustomSqlserver::describe
,但对于大多数(不是全部)效果,它们的行为就像常规表一样。但主要限制是不能有重复的表名。
您需要向DATABASE_CONFIG
添加新连接,但您可以在构造函数中执行此操作,以便您可以继承default
数据库凭据,只需修改database
名称:-
public function __construct() {
$this->alt = $this->default;
$this->alt['database'] = 'provincia';
}
然后在您的Provincia
模型中,您可以交换到alt
数据库连接:-
public function __construct($id = false, $table = null, $ds = null) {
parent::__construct($id, $table, $ds);
$this->useDbConfig = 'alt';
}