从另一个数据库中读取表



是否可以使用内置的 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',
// ...
);
}

。这只是冰山一角。数据结构占两个级别:

  1. 模式(例如dbo)
  2. 表(例如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';
}

最新更新