CakePHP switch database (using same datasource) on the fly?

前端 未结 2 1416
说谎
说谎 2020-12-03 06:08

I have tried to build a small function that would be use in controller to switch database on the fly, i must use only one datasource.

On my database.php :

         


        
相关标签:
2条回答
  • 2020-12-03 06:51

    I just wanted to tell that nowadays it's really simple to change current model's datasource (database connection):

    For example in my PersonsController index:

    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);
    }
    

    As you can see the key here is to use $this->Model->setDataSource()

    0 讨论(0)
  • 2020-12-03 06:57

    Made it work using this (create a new connection on the fly) :

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

    With :

    /**
     * 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;
    
    }
    
    0 讨论(0)
提交回复
热议问题