cakephp 3
の複数のデータベースに接続しようとしています。私は何度も試しましたが、すべての質問と回答はcakephp 2
にあります。 接続の構成 atcakephp 3
ドキュメントを見つけました。しかし、理解できません。
私は2つのデータベースを持っています:
1. tracking_system
(Tables: trackers, events, etc..)
2. tracking_system_2
(Tables: todos, actions, etc..)
データベースtracking_systemの操作は完全に実行されています。しかし、複数のデータベースに接続する方法がわかりません(私の場合、2番目のデータベースtracking_system2を使用)。
助けてくれてありがとう。
デフォルトで別の接続を使用するテーブルでdefaultConnectionName()
メソッドを宣言できます。テーブルクラスのいずれか:
public static function defaultConnectionName()
{
return 'another_config_name';
}
問題の解決策が得られました。問題なく動作しています。どこかで間違っている場合は、以下のコードを参照してコメントしてください。
-> 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);
}
}
}
-> 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');
}
}
それでおしまい。
ありがとうございました...
モデルのデータベースを切り替えるには、
コントローラ/モデルで名前空間を使用する
use Cake\Datasource\ConnectionManager;
コントローラー内;-
$conn = ConnectionManager::get('remote_db_1');
$this->ModelName->connection($conn);
モデルの場合:-
$conn = ConnectionManager::get('remote_db_1');
$this->connection($conn);
注:-関連するテーブルのデータも保存する場合は、関連するデータのDBを変更することを忘れないでください。そうしないと、関連するテーブルのデータがデフォルトの接続/ DBに挿入されます。
これがCakePHP3の答えです。*