CakePHP 2.x - 数据库切换(适用于整个应用程序)

时间:2014-08-18 10:29:18

标签: php database cakephp datasource

背景 我有一个管理系统,需要连接和编辑多个数据库。数据库结构彼此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')?或者我是否真的需要手动为所有相关模型进行操作?

2 个答案:

答案 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,按预期工作。