从另一个数据库读取 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',
// ...
);
}
...这只是冰山一角。数据结构占两个层次:
- 架构(例如
dbo
)
- Table(例如
users
)
它们不是为顶部的额外 数据库 级别而设计的。结果,您最终需要修补如此多的代码,以至于不值得付出努力。
我也一直在玩Synonyms in SQL Server。这是一条更有前途的途径,因为尽管您仍然需要自己编写 \CustomSqlserver::listSources
和 \CustomSqlserver::describe
,但对于大多数(不是所有)效果而言,它们的行为与常规 table 一样。主要限制是不能有重复的 table 名称。
是否可以使用构建 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',
// ...
);
}
...这只是冰山一角。数据结构占两个层次:
- 架构(例如
dbo
) - Table(例如
users
)
它们不是为顶部的额外 数据库 级别而设计的。结果,您最终需要修补如此多的代码,以至于不值得付出努力。
我也一直在玩Synonyms in SQL Server。这是一条更有前途的途径,因为尽管您仍然需要自己编写 \CustomSqlserver::listSources
和 \CustomSqlserver::describe
,但对于大多数(不是所有)效果而言,它们的行为与常规 table 一样。主要限制是不能有重复的 table 名称。