是否可以使用构建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。
答案 0 :(得分:1)
到目前为止,我将分享我的发现......
简短回答:你不能。
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
)它们不是为顶部的额外数据库级别而设计的。因此,您最终需要修补这么多代码,以至于不值得付出努力。
我也一直在玩Synonyms in SQL Server。这是一个更有前途的路径,因为虽然你仍需要自己编写\CustomSqlserver::listSources
和\CustomSqlserver::describe
,但对于大多数(并非所有)效果,它们的行为都像常规表一样。但主要的限制是不能有重复的表名。
答案 1 :(得分:0)
您需要向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';
}