我正在尝试动态更改cakephp 3中使用的数据库连接。我找到的这个问题的每个答案都指的是cakephp 2(These three for实例)。
This guy找到了cakephp 3的解决方案,该解决方案具有有限数量的数据库,并且具体定义哪个数据库将由哪个表文件使用。
问题是我想为每个新用户创建一个新数据库,并在他登录时更改为他的数据库。我事先无法知道将存在的所有数据库,将其写入config/app.php
文件。
我无法在每个/ src / Model / Table文件中设置默认数据库,因为每个数据库中的表都相同。
使用ConnectionManager::config()
函数动态创建连接和ConnnectionManager::alias()
方法,以使所有Table类默认使用它。
这里有一篇非常好的文章描述了这个过程:
http://mark-story.com/posts/view/using-cakephp-and-a-horizontally-sharded-database
唯一的区别是您可以动态创建连接配置,而不是手动声明分片,如该文章中所示。
更改一个模型的数据库连接:
在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]);
namespace App\Model\Table;
use Cake\ORM\Table;
class ArticlesTable extends Table
{
public static function defaultConnectionName() {
return 'replica_db';
}
}