proyecto - Cakephp no puede cambiar la base de datos sobre la marcha
cakephp3 (2)
Estoy intentando conectarme desde las bases de datos múltiples desde un bucle, pero las seens CakePHP no pueden cambiar la database
, solo otras informaciones (como user / pass / host).
app / Config / database.php
<?php
class DATABASE_CONFIG {
[...]
public $default = array(
[..] // Where I have the companies
);
public $client = array(
[...] // Fakke settings, because I will change it on-the-fly
);
}
app / Controller / CronController.php
$companies = $this->Company->find(''all'');
foreach($companies as $company) {
$settings = array(
''datasource'' => ''Database/Mysql'',
''host'' => $company[''Company''][''host''],
''login'' => $company[''Company''][''username''],
''password'' => $company[''Company''][''password''],
''database'' => $company[''Company''][''database''],
);
ConnectionManager::drop(''client'');
$db = ConnectionManager::create(''client'', $settings);
try {
debug($this->MyModel->find(''first''));
} catch (Exception $e) {
echo ''<pre>'';
echo "Exception: ", $e->getMessage(), "/n";
/*
debug($this->MyModel->getDataSource());
Outputs:
[...]
[config] => Array
(
[persistent] =>
[host] => 0.0.0.0 // CORRECT HOST
[login] => root // CORRECT LOGIN
[password] => pass // CORRECT PASSWORD
[database] => database1
[port] => 3306
[datasource] => Database/Mysql
[prefix] =>
[encoding] => utf8
)
[...]
*/
}
}
Devuelve la primera conexión y todas las demás no puedo seleccionar nada de MyModel, porque está mal. Se ve la conexión del usuario / contraseña / host está bien, pero las bases de datos no se modifican, por lo tanto, como el usuario no tiene permiso para seleccionar en la base de datos, recibo el error.
Array
(
// First connection, connection ok, MyModel return nothing
)
// Second connection
Exception: SQLSTATE[42000]: Syntax error or access violation: 1142 SELECT command denied to user ''database_user_2''@''localhost'' for table ''my_model''
// Third connection
Exception: SQLSTATE[42000]: Syntax error or access violation: 1142 SELECT command denied to user ''database_user_3''@''localhost'' for table ''my_model''
// Fourth connection
Exception: SQLSTATE[42000]: Syntax error or access violation: 1142 SELECT command denied to user ''database_user_4''@''localhost'' for table ''my_model''
// Fifth connection
Exception: SQLSTATE[42000]: Syntax error or access violation: 1142 SELECT command denied to user ''database_user_5''@''localhost'' for table ''my_model''
¡Gracias!
Intenta no soltar la configuración, solo modifica las cosas que necesitas.
Para esta tarea uso con éxito
$dataSource = ConnectionManager::getDataSource(''company_data'');
$dataSource->config[''schema''] = ''company_''.$id;
No sé si el cambio de base de datos y mysql como motor son buenos pares. Yo uso esquemas postgresql para este propósito.
Puede usar el método del modelo setSource () para cambiar la tabla o setDataSource () para cambiar la configuración de db.