我正在尝试连接到 cakephp 3
中的多个数据库。我已多次尝试,但所有问题和答案都在 cakephp 2
。我在 cakephp 3
文档中找到了Configuring Connections。但我无法理解。
我有两个数据库:
1. tracking_system
(Tables: trackers, events, etc..)
2. tracking_system_2
(Tables: todos, actions, etc..)
使用数据库 tracking_system 已完全运行。 但我不知道,如何连接到多个数据库(在我的情况下,使用第二个数据库 tracking_system2 )。
提前感谢您的帮助。
答案 0 :(得分:7)
我得到了解决问题的方法。它运作良好。如果我在任何地方出错,请参考以下代码和评论。
- >的 app.php 强>
'Datasources' => [
'default' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
//'port' => 'nonstandard_port_number',
'username' => 'your_username',
'password' => 'your_password',
'database' => 'tracking_system', // This is my default database
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'quoteIdentifiers' => false,
//'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
],
'db2' => [
'className' => 'Cake\Database\Connection',
'driver' => 'Cake\Database\Driver\Mysql',
'persistent' => false,
'host' => 'localhost',
//'port' => 'nonstandard_port_number',
'username' => 'your_username',
'password' => 'your_password',
'database' => 'tracking_system2', // This is my second database
'encoding' => 'utf8',
'timezone' => 'UTC',
'cacheMetadata' => true,
'quoteIdentifiers' => false,
//'init' => ['SET GLOBAL innodb_stats_on_metadata = 0'],
]
]
- >的 TodolistsController.php 强>
database name: tracking_system2
table name: todolists
使用Cake \ Datasource \ ConnectionManager;
我的 TodolistsController.php 代码是:
<?php
namespace App\Controller;
use App\Controller\AppController;
use Cake\ORM\TableRegistry;
use Cake\ORM\Entity;
use Cake\Network\Exception\NotFoundException;
use Cake\Datasource\ConnectionManager; // This line is required
class TodolistsController extends AppController
{
public function todoadd(){
$connection = ConnectionManager::get('db2'); // 'db2' where my second database is configured
$results = $connection->execute('SELECT * FROM todolists')->fetchAll('assoc');
$this->set('results', $results);
if($this->request->is('post')){
$connection->insert('todolists', [
'title' => $this->request->data['title'],
'description' => $this->request->data['description']
]);
$this->redirect($this->referer);
}
}
}
- &GT;的 TodolistsTable.php 强>
<?php
namespace App\Model\Table;
use Cake\ORM\Table;
class TodolistsTable extends Table
{
public static function defaultConnectionName()
{
return 'db2';
}
public function initialize(array $config)
{
$this->addBehavior('Timestamp');
}
}
就是这样。
谢谢......
答案 1 :(得分:0)
要切换模型的数据库,
在控制器/模型中使用命名空间
use Cake\Datasource\ConnectionManager;
在控制器中; -
$conn = ConnectionManager::get('remote_db_1');
$this->ModelName->connection($conn);
在模特中: -
$conn = ConnectionManager::get('remote_db_1');
$this->connection($conn);
注意: - 如果您也要保存关联表的数据,请继续 记住要更改相关数据的数据库,否则为数据 关联表将插入默认连接/ DB。
这是CakePHP 3的答案。*
答案 2 :(得分:-1)
如果适用于你,可以尝试使用useDbConfig模型属性。
class Example extends AppModel { public $useDbConfig = 'default1DbConfigSettings'; //The useDbConfig property is defaulted to the ‘default’ database connection. }