I\'m trying to change the database connection used in cakephp 3 on the fly. Every answer to this question that I found refers to cakephp 2 (The
Configuring table connections
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
public static function defaultConnectionName() {
return 'replica_db';
}
}
Use the ConnectionManager::config()
function to create connections on the fly and the ConnnectionManager::alias()
method to make all your Table classes use it by default.
There is a very good article describing the process here:
http://mark-story.com/posts/view/using-cakephp-and-a-horizontally-sharded-database
The only difference is that you can create the connection config on the fly instead of declaring the shards manually as it was shown in that article.
Change database connection for one model:
In app.php :
'test' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => MySQL_HOST,
//'port' => 'nonstandard_port_number',
'port' => MySQL_PORT,
'username' => MySQL_USER,
'password' => MySQL_PASS,
'database' => 'test',
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'quoteIdentifiers' => false,
'log' => false,
//'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
]
In Controller :
$conn = ConnectionManager::get('test');
$_model = TableRegistry::get('your_alias', ['table' => 'your_table', 'connection' => $conn]);