从另一个数据库中读取表

时间:2017-05-10 10:10:52

标签: sql-server cakephp cakephp-2.9

是否可以使用构建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。

2 个答案:

答案 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',
        // ...
    );
}

......这只是冰山一角。数据结构有两个层次:

  1. 架构(例如dbo
  2. 表格(例如users
  3. 它们不是为顶部的额外数据库级别而设计的。因此,您最终需要修补这么多代码,以至于不值得付出努力。

    我也一直在玩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';
}