背景 我有一个管理系统,需要连接和编辑多个数据库。数据库结构彼此100%相似,但数据各不相同。
我尝试了什么:
我试图在控制器中使用$this->Model->setDataSource('db_variable_here');
来动态更改数据库。问题在于,所有相关数据似乎仍然来自我的默认数据库。
示例:
想象一下:User
HABTM Post
,如果我想从不同的数据库中获取帖子,并使用$this->Post->setDataSource('db_variable_here');
来实现这一点,那么似乎我仍然从我的相关用户默认数据库,与我收到的帖子不一样。
我猜这是因为我只更改了模型Post
上的数据库,所以可以通过对每个相关模型执行$this->Model->setDataSource('db_variable_here');
来修复它。
我的问题:
是否可以动态更改应用程序中每个模型的数据源?
防爆。类似于:$this->setDatasource('datasource_name')
?或者我是否真的需要手动为所有相关模型进行操作?
答案 0 :(得分:0)
您可以尝试在AppModel中创建自己的getDataSouce方法。
你可以在这里看到CakePHP: https://github.com/cakephp/cakephp/blob/master/lib/Cake/Model/ConnectionManager.php
因此,在您的AppModel中,只需确保接受/返回da
class AppModel extends Model {
//...
public function getDataSource() {
// some logic here to determine which source you want
// Maybe use Configure::write('MYSOURCE', 'other_datasource');
// somewhere else, then just check it here.
$source = 'default';
$this->setDataSource($source);
return parent::getDataSource();
}
//...
}
这应该被调用而不是CakePHP' getDataSource()'然后它将运行您的检查以确定要使用哪个连接,然后调用CakePHP' s' getDataSouce()'完成获取数据源的其余实际工作。
假设您设置了一个可从此处访问的变量(如配置变量),您可以在应用中的任何位置设置一次,当运行时,它将使用您指定的任何内容。 / p>
答案 1 :(得分:0)
只需保存您需要在Session / Cookie中使用的数据库(无论您喜欢什么),然后在AppModel的__constructor()
中,如果定义了Session变量,则覆盖setDataSource()
或{{1因此。
请注意,默认情况下,IIRC Cake的Session / Cookie在模型上不可用(因为它不应该是这样),所以你可能想要使用好的'$ _SESSION或$ _COOKIE,否则你需要加载它{ {1}}。
我这样做是为了选择使用Azure SQL数据库或Rackspace MySQL数据库,具体取决于域/ URL,按预期工作。