CakePHP3を使用していて複数のデータベースへ接続をしたいという機会があると思います。
今回の記事では、CakePHP3を使用して複数のデータベースへ接続する方法を紹介します。
CakePHP2系は下記の記事を。
config/app.phpを編集する
まず、config/app.phpを編集します。Datasources配列にデフォルトのデータベースともう一つ接続したいデータベースを設定します。
今回は、デフォルト以外に2つのリモートデータベースへ接続する方法です。
'Datasources' => [ 'default' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => 'localhost', 'port' => '3306', 'username' => 'YOUR_DB_USER', 'password' => 'YOUR_DB_PASS', 'database' => 'YOUR_DB_NAME', 'encoding' => 'utf8', 'timezone' => 'UTC', 'flags' => [], 'cacheMetadata' => false, 'log' => false, 'quoteIdentifiers' => false, 'url' => env('DATABASE_URL', null), ], 'remote_db_1' => [ /*Remote Database 1*/ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => '192.168.1.47', /*YOUR_REMOTE_SERVER_IP*/ 'port' => '3306', 'username' => 'REMOTE_DB_USER', 'password' => 'REMOTE_DB_PASS', 'database' => 'REMOTE_DB_NAME', 'encoding' => 'utf8', 'timezone' => 'UTC', 'flags' => [], 'cacheMetadata' => false, 'log' => false, 'quoteIdentifiers' => false, 'url' => env('DATABASE_URL', null), ], 'remote_db_2' => [ /*Remote Database 2*/ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => '192.168.1.47', /*YOUR_REMOTE_SERVER_IP*/ 'port' => '3306', 'username' => 'REMOTE_DB_USER', 'password' => 'REMOTE_DB_PASS', 'database' => 'REMOTE_DB_NAME', 'encoding' => 'utf8', 'timezone' => 'UTC', 'flags' => [], 'cacheMetadata' => false, 'log' => false, 'quoteIdentifiers' => false, 'url' => env('DATABASE_URL', null), ],
リモートのデータベースへの接続方法とクエリの流し方
デフォルト以外のリモートのデータベースへ接続するには、コントローラで下記のようにします。
use Cake\Datasource\ConnectionManager; use \PDO; class YourController extends AppController{ public function getRemoteData(){ $conn1 = ConnectionManager::get('remote_db_1'); #Remote Database 1 $conn2 = ConnectionManager::get('remote_db_2'); #Remote Database 2 } }
こうすることで、$conn1と$conn2に二つのデータベースへ接続するためのコネクションオブジェクトができました。
実際にする際には、次のようにクエリを流すとデータベースへ接続し、テーブルを更新したりすることができます。
class YourController extends AppController{ public function getRemoteData(){ $conn1 = ConnectionManager::get('remote_db_1'); #Remote Database 1 $sql = "SELECT * FROM users"; $query = $conn1->prepare($sql); $query->execute(); $result = $query->fetchAll(); #Here is the result } }
また、このコネクションオブジェクトを使用して、テーブルを扱う方法は、公式サイトを参照して見てください。
モデルごとに接続するデータベースを変更する際は、下記のように設定することでモデルごとに接続を変更することができるようです。
この方法を使用すると、クエリビルダを使用でき便利だと思います。
モデルに記述する内容
<?php namespace App\Model\Table; use Cake\ORM\Table; class SamplesTable extends AppModel { ... //この関数を追加します public static function defaultConnectionName(){ return 'remote_db_1'; } ... }
この方法を使用するとAppModelで接続させたい条件に応じて、データベースへの接続条件を変えるなんてことも可能です。
[参考]
・https://stackoverflow.com/questions/29981890/multiple-database-connection-in-cakephp-3