cakePHP3で複数のデータベースに接続することができます。
まず設定ファイルで複数のデータベースを定義します。(defaultはそのままにしておきます。)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
'Datasources' => [ 'default' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => 'host1', 'username' => 'user1', 'password' => 'pass1', 'database' => 'sample_db1', 'encoding' => 'utf8', 'timezone' => 'UTC', 'flags' => [], 'cacheMetadata' => true, 'log' => true, 'quoteIdentifiers' => false, 'url' => env('DATABASE_URL', null), ], 'db_2' => [ 'className' => 'Cake\Database\Connection', 'driver' => 'Cake\Database\Driver\Mysql', 'persistent' => false, 'host' => 'host2', 'username' => 'user2', 'password' => 'pass2', 'database' => 'sample_db2', 'encoding' => 'utf8', 'timezone' => 'UTC', 'flags' => [], 'cacheMetadata' => true, 'log' => true, 'quoteIdentifiers' => false, 'url' => env('DATABASE_URL', null), ], |
基本的には使用したいデータベース接続情報を下記のようにModelに書いてあげればOKです。
1 2 3 |
public static function defaultConnectionName(){ return 'db_2'; } |
私が使いたいケースはプルダウンを変更した時にPOSTでデータベースの接続先情報を投げる、という処理をしました。
POSTの情報をControoller側で受け取りSESSIONに格納します。このあとModel(Table)にこの情報を渡しますが、継承関係がAppTable ← SampleTableなっている場合、
AppTable.php
1 2 3 |
public static function defaultConnectionName(){ return ( !empty($_SESSION['database_type']) ) ? $_SESSION['database_type'] :'default'; } |
SampleTable.php
1 2 3 |
public static function defaultConnectionName(){ return parent::defaultConnectionName(); } |
と書いておくと楽です。