CakePHP 3中的动态数据源和全球



i具有许多数据库使用的应用程序。要选择具有应用程序数据的数据库,我有一个带有连接参数的数据库(主机,用户名,通行,数据库...)

问题是,该动态创建的数据源对应用程序的其余部分不起作用。

控制器代码

$data       = $this->request->data;
$connection = ConnectionManager::get("default");
$query      = "SELECT * FROM clients WHERE client_id = ".$data['codigo'];
$result     = $connection->execute($query)->fetchAll('assoc');
ConnectionManager::drop('default');            
$config = ConnectionManager::config('connection', [
        'className' => 'CakeDatabaseConnection',
        'driver' => 'CakeDatabaseDriverMysql',
        'persistent' => false,
        'host' => $result[0]['host'],
        'username' => $result[0]['username'],
        'password' => $result[0]['password'],
        'database' => $result[0]['database'],
        'encoding' => 'utf8',
        'timezone' => 'UTC',
        'flags' => [],
        'cacheMetadata' => true,
        'log' => false,
        'quoteIdentifiers' => false,
        'url' => env('DATABASE_URL', null),
    ]);
$connection = ConnectionManager::get('connection');
ConnectionManager::alias('connection', 'default');
return $this->redirect(['controller' => 'Mains', 'action' => 'index']);

重定向后,显然其他控制器没有此数据源。

基于请求数据中的内容交换数据库肯定有点不寻常 - 但是通常,数据库连接仅在Cake的初始设置中早些时候需要进行,因为每个控制器的连接资源已经存在设置为default

如果您只交换一次,则可以在config/bootstrap.php内部管理此此操作(Cake通常设置其连接manager)。

您无法访问$this->request,但可以从$ _request中获取它,例如:

config/bootstrap.php中,更改以下行:

Cache::config(Configure::consume('Cache'));
ConnectionManager::config(Configure::consume('Datasources'));
Email::configTransport(Configure::consume('EmailTransport'));

对此:

Cache::config(Configure::consume('Cache'));
ConnectionManager::config(Configure::consume('Datasources'));
$connection = ConnectionManager::get("default");
$client = TableRegistry::get('Clients')->find()
    ->where(['client_id'=> $_REQUEST['client_id']])->firstOrFail();
ConnectionManager::drop('default');
$config = ConnectionManager::config('connection', [
    'className' => 'CakeDatabaseConnection',
    'driver' => 'CakeDatabaseDriverMysql',
    'persistent' => false,
    'host' => $client->host,
    'username' => $client->username,
    'password' => $client->password,
    'database' => $client->database,
    'encoding' => 'utf8',
    'timezone' => 'UTC',
    'flags' => [],
    'cacheMetadata' => true,
    'log' => false,
    'quoteIdentifiers' => false,
    'url' => env('DATABASE_URL', null),
]);
ConnectionManager::get('connection');
Email::configTransport(Configure::consume('EmailTransport'));

编辑:从您的原始SQL切换到表:: find()

最新更新