style - ¿La base de datos del switch CakePHP(usando el mismo origen de datos) sobre la marcha?
this-> html-> image style (2)
He intentado crear una pequeña función que se usaría en el controlador para cambiar de base de datos sobre la marcha, debo usar solo un origen de datos.
En mi database.php:
function __construct() {
$server = Configure::read(''Server'');
if(!empty($server[''database''])) $this->local[''database''] = $server[''database''];
$this->default = $this->{$server[''datasource'']};
}
Se usa para cambiar la base de datos dependiendo de la configuración del servidor. Está funcionando bien.
Traté de construir esto:
/**
* 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;
}
Pero, por desgracia, todo parece funcionar, pero siempre obtuve datos de la misma base de datos usando $this->Player->find(''list'')
por ejemplo. Intenté $this->Player->cacheQueries = false;
sin más éxito
Hizo que funcione usando esto (crea una nueva conexión sobre la marcha):
$newDbConfig = $this->dbConnect($serverConfig);
$this->Model->useDbConfig = $newDbConfig[''name''];
$this->Model->cacheQueries = false;
Con :
/**
* 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;
}
Solo quería decir que hoy en día es muy simple cambiar el origen de datos del modelo actual (conexión a la base de datos):
Por ejemplo, en mi índice 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);
}
Como puede ver, la clave aquí es usar $ this-> Model-> setDataSource ()