Cakephp не может изменить базу данных на лету
Я пытаюсь подключиться из нескольких баз данных из цикла, но видит CakePHP не может измениться database
, только другие данные (например, пользователь / пароль / хост).
приложение / 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
);
}
приложение / 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
)
[...]
*/
}
}
Он возвращает первое соединение и все остальные я ничего не могу выбрать из MyModel, потому что это неправильно. Он видит соединение от пользователя / пароля / хоста в порядке, но база данных не изменена, поэтому, поскольку у пользователя нет разрешения на выбор в базе данных, я получаю сообщение об ошибке.
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'
Спасибо!
2 ответа
Постарайтесь не сбрасывать конфигурацию, просто измените то, что вам нужно.
Для этой задачи я успешно использую
$dataSource = ConnectionManager::getDataSource('company_data');
$dataSource->config['schema'] = 'company_'.$id;
Я не знаю, если переключение базы данных и MySQL как двигатель хорошая пара. Я использую схемы postgresql для этой цели.
Вы можете использовать метод модели setSource() для изменения таблицы или setDataSource() для изменения конфигурации db.