【问题标题】:CakePHP switch database (using same datasource) on the fly?CakePHP 即时切换数据库(使用相同的数据源)?
【发布时间】:2011-04-01 10:49:13
【问题描述】:

我尝试构建一个小功能,用于控制器中即时切换数据库,我必须只使用一个数据源。

在我的 database.php 上:

function __construct() {

    $server = Configure::read('Server');

    if(!empty($server['database'])) $this->local['database'] = $server['database'];
    $this->default = $this->{$server['datasource']};

}

用于根据服务器配置切换数据库。效果很好。

我试图建立这个:

/**
 * Connects to specified database
 *
 * @param array $config Server config to use {datasource:?, database:?}
 * @return array db->config on success, false on failure
 * @access public
 */
function dbConnect($config = array()) {
    ClassRegistry::init('ConnectionManager');
    //debug($config['datasource']);
    //$dbInstance =& ConnectionManager::getInstance();
    //$dbInstance->config->{$config['datasource']}['database'] = $config['database'];

    $db =& ConnectionManager::getDataSource($config['datasource']);
    $db->disconnect();
    $db->cacheSources = false;
    $db->config['database'] = $config['database'];
    $db->config['persistent'] = false;
    debug($db->config);
    $db->connect();
    if(!$db->isConnected()) {
        $this->error('!$db->isConnected()');
        return false;
    }
    return $db->config;
}

但遗憾的是,一切似乎都正常,但我总是使用 $this->Player->find('list') 从同一个数据库获取数据。我尝试了$this->Player->cacheQueries = false;,但没有成功。

【问题讨论】:

    标签: php database cakephp cakephp-1.3


    【解决方案1】:

    使用它使其工作(即时创建新连接):

    $newDbConfig = $this->dbConnect($serverConfig);
    $this->Model->useDbConfig = $newDbConfig['name'];
    $this->Model->cacheQueries = false;
    

    与:

    /**
     * Connects to specified database
     *
     * @param array $config Server config to use {datasource:?, database:?}
     * @return array db->config on success, false on failure
     * @access public
     */
    function dbConnect($config = array()) {
        ClassRegistry::init('ConnectionManager');
    
        $nds = $config['datasource'] . '_' . $config['database'];
        $db =& ConnectionManager::getDataSource($config['datasource']);
        $db->setConfig(array('name' => $nds, 'database' => $config['database'], 'persistent' => false));
        if($ds = ConnectionManager::create($nds, $db->config)) return $db->config;
        return false;
    
    }
    

    【讨论】:

    • 没关系,我想通了!一切尽在Controller!这太棒了,太好了,你拯救了我的一天……一年过去了;)谢谢!这是my question关于这个主题的内容。
    • 紧急:我在 foreach 循环中一一连接每个数据库时遇到问题。它在每个循环中选择第一个数据库。是缓存问题吗?请帮忙!
    【解决方案2】:

    我只想告诉大家,现在改变当前模型的数据源(数据库连接)真的很简单:

    例如在我的 PersonsController 索引中:

    public function index() {
    
        //change to a different datasource which is already written in App/Config/database.php-file
        $this->Person->setDataSource('testdb2');
        $persons = $this->Person->find('all');
        $this->set('db1persons', $persons);
    
        //change to a different database
        $this->Person->setDataSource('testdb');
        $persons = $this->Person->find('all');
        $this->set('db2persons', $persons);
    }
    

    如你所见,这里的关键是使用 $this->Model->setDataSource()

    【讨论】:

    • 恐怕,这不会动态工作。如果每个客户端有 1 个数据库,这不是您想要的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-27
    • 2012-12-07
    • 2017-06-12
    相关资源
    最近更新 更多