从另一个数据库读取 table

Read table from another database

是否可以使用构建 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');
    }
}

...触发器:

Error: Table shared_data.dbo.provincia for model Provincia was not found in datasource default.

您需要向 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';
}

我将分享我目前的发现...

简短回答:你不能

CakePHP 的魔力在很大程度上取决于从 INFORMATION_SCHEMA 视图中获取的有关 table 和列的信息。该信息收集在 \Sqlserver::listSources(table 列表)和 \Sqlserver::describe(列列表)中。

虽然可以扩展数据源驱动程序并重新实现这些方法:

// Model/Datasource/CustomSqlserver.php
class CustomSqlserver extends Sqlserver {
}
class DATABASE_CONFIG {
    public $default = array(
        'datasource' => 'CustomSqlserver',
        // ...
    );
}

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

  1. 架构(例如dbo
  2. Table(例如users

它们不是为顶部的额外 数据库 级别而设计的。结果,您最终需要修补如此多的代码,以至于不值得付出努力。


我也一直在玩Synonyms in SQL Server。这是一条更有前途的途径,因为尽管您仍然需要自己编写 \CustomSqlserver::listSources\CustomSqlserver::describe,但对于大多数(不是所有)效果而言,它们的行为与常规 table 一样。主要限制是不能有重复的 table 名称。