Dynamic Databases

Posted: May 19th, 2008 | Author: andre | Filed under: CakePHP | No Comments »

Depois de procurar por muito tempo como fazer com que o cake utilizasse varias databases, consegui encontrar alguma informação mas nada que fosse oque eu estva procurando, então resolvi modificar o database.php pra poder usar um DB onde as informaões estariam guardadas em um banco.
o Caso:
Existe um tabela no banco onde se econtram informações sobre outro banco de dados, como fazer o cake utilizar essas informações e conectar a esse banco dinamicamente?

Solução:
isso soa mais como um hack do que uma solução, mas o que fiz foi fazer com que o database.php se conectasse primeiro ao banco principal e resgatasse as informações do banco secundário e ao mesmo tempo atribuir esses valores a variável do segundo banco.

class DATABASE_CONFIG
{
	var $default = array('driver' => 'mysql',
								'persistent' => false,
								'connect' => 'mysql_connect',
								'host' => 'localhost',
								'login' => 'user',
								'password' => 'pass',
								'database' => 'pg_main',
								'prefix' => '');
 
	var $panel = array('driver' => 'mysql',
								'persistent' => false,
								'connect' => 'mysql_connect',
								'host' => '',
								'login' => '',
								'password' => '',
								'database' => 'pg_website',
								'prefix' => '');

Criei além da conexão default uma conexão $panel em branco. Então dentro da classe database criei o metodo construtor para resgatar os valores do banco default.

function DATABASE_CONFIG() {
		$domain = $_SERVER['HTTP_HOST'];
		//remove any www.
		$domain = str_replace('www.', '', $domain);
		$domain = str_replace('.localhost', '', $domain);
		//$domain = 'pgwebsite';
 
		//connect to the default server and get the info about the cliente database
		$link = mysql_connect($this->default['host'], $this->default['login'], $this->default['password']);
		if (!$link) {
			die("Erro na conexao");
		} elseif (!mysql_select_db($this->default['database'], $link)) {
			die("Erro na conexao");
		}
		echo mysql_error();
		if (($result = mysql_query('select * from websites',$link))) {
			$someone = mysql_fetch_assoc($result);
		}
 
		//set the database array for the panel conector
		$this->panel['host'] = $someone['dburl'];
		$this->panel['login'] = $someone['dbuser'];
		$this->panel['password'] = $someone['dbsenha'];
		mysql_close($link);
	}

Nota-se que é um metodo simples, mas realmente é bastante funcional qdo vc trata de varias conexões, neste exemplo a variável $user era setada por meio de leitura da url em um alias, ex. meusite.dominio.com, sendo assim resgatando as informações do usuário “meusite” no banco $default.

Depois é só utilizar $useDbConfig nos seus models para usar o banco $panel:

<code>&lt;?php class Model extends AppModel {
		var $name = 'Model';var $useDbConfig = "panel";
}
?&gt;</code>

O Principal motivo de utilizar este metodo é que se vc setar o banco durante o runtime do cake ele não é utilizavel via $useDbConfig no model.



Leave a Reply