更改cakephp3中的默认数据库

时间:2017-06-08 06:30:53

标签: cakephp cakephp-3.0

在控制器中我想更改默认数据库,以便我可以从网站的任何位置访问新的数据库(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

2 个答案:

答案 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;
    }
}

在上面的示例中,我使用特殊的请求头来切换数据库。