База данных коммутатора CakePHP (используя тот же источник данных) на лету?

Я попытался создать небольшую функцию, которая будет использоваться в контроллере для переключения базы данных «на лету», я должен использовать только один источник данных.

На моем 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; без каких-либо успехов.

Solutions Collecting From Web of "База данных коммутатора CakePHP (используя тот же источник данных) на лету?"

Сделал это с помощью этого (создайте новое соединение «на лету»):

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

Я просто хотел сказать, что в настоящее время очень просто изменить источник данных текущей модели (подключение к базе данных):

Например, в моем индексе PersonController:

 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 ()