在控制器中我想更改默认数据库,以便我可以从网站的任何位置访问新的数据库(db2)。 db2数据库具有相同的模型,但只有不同的数据。我的代码只访问其他数据库,但没有将新的默认数据库设置为db2,可以在网站的任何地方访问。我没有从下面的帖子中得到答案。
这是我的控制器:
$connection = ConnectionManager::get('db2'); // 'db2' where my second database is configured
$results = $connection->execute('SELECT * FROM tutors')->fetchAll('assoc');
//this works but doesnt set the default database to db2 everywhere
这是我的app.php:
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
//'port' => 'non_standard_port_number',
'username' => 'root',
'password' => '',
'database' => 'aptutori_test',
'encoding' => 'utf8',
'timezone' => '+11:00',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
'quoteIdentifiers' => false,
'url' => env('DATABASE_URL', null),
],
'db2' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
//'port' => 'non_standard_port_number',
'username' => 'root',
'password' => '',
'database' => 'aptutori_testbak',
'encoding' => 'utf8',
'timezone' => '+11:00',
'flags' => [],
'cacheMetadata' => true,
'log' => false,
'quoteIdentifiers' => false,
'url' => env('DATABASE_URL', null),
],
Dynamically change database connection in cakephp 3
http://mark-story.com/posts/view/using-cakephp-and-a-horizontally-sharded-database
答案 0 :(得分:2)
使用ConnectionManager::alias()
:
http://api.cakephp.org/3.0/class-Cake.Datasource.ConnectionManager.html#_alias
例如,这将使所有需要default
连接的表格使用db2
:
ConnectionManager::alias('db2', 'default');
答案 1 :(得分:0)
您可以在cake 3.3的中间件中广泛地使用此应用程序,而不是像http://mark-story.com/posts/view/using-cakephp-and-a-horizontally-sharded-database中所述使用DispatcherFilter。
<?php
namespace App\Middleware;
use Cake\Datasource\ConnectionManager;
class TenantShardMiddleware
{
public function __invoke($request, $response, $next)
{
$tenant = $request->getHeader('MY-tenant');
ConnectionManager::alias($tenant[0], 'default');
$response = $next($request, $response);
return $response;
}
}
在上面的示例中,我使用特殊的请求头来切换数据库。