我试图动态更改 cakephp 3 中使用的数据库连接。我找到的这个问题的每个答案都涉及 cakephp 2 (These three for个实例)。
This guy找到了 cakephp 3 的解决方案,该解决方案具有有限数量的数据库,并专门定义哪个数据库将由哪个表文件使用。
问题是我想为每个新用户创建一个新数据库,并在他登录时更改为他的数据库。我事先不能知道将存在的所有数据库,将其写入config/app.php
个文件。
我无法在每个/ src / Model / Table文件中设置默认数据库,因为每个数据库中的表都相同。
答案 0 :(得分:5)
使用ConnectionManager::config()
函数动态创建连接,使用ConnnectionManager::alias()
方法使所有Table类默认使用它。
这里有一篇非常好的文章描述了这个过程:
http://mark-story.com/posts/view/using-cakephp-and-a-horizontally-sharded-database
唯一的区别是你可以动态创建连接配置,而不是像那篇文章中那样手动声明分片。
答案 1 :(得分:0)
更改一个模型的数据库连接:
在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'],
]

在控制器中:
$conn = ConnectionManager::get('test');
$_model = TableRegistry::get('your_alias', ['table' => 'your_table', 'connection' => $conn]);

答案 2 :(得分:0)
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
public static function defaultConnectionName() {
return 'replica_db';
}
}