LoginSignup
6
5

More than 5 years have passed since last update.

CakePHP3にて複数のDBを使う場合

Posted at

経緯と概要

CakePHP3において、複数DBにまたがってデータ参照をする場合の設定方法を記します。
特に、テストのときに狙ったtest用DBを向かなくてはまりました。
2016/11/8現在, わかりやすい位置に本エントリに該当する説明がなかったので何かの助けになればと思います。

configの設定

例えばdefaultでとあるDB「hoge」, 別でDB「fuga」を参照したい場合
http://book.cakephp.org/3.0/ja/development/testing.html#id13
公式のこの辺りを参照してconfigに記述します。

config/app.php
(中略)
'Datasources' => [
    /* デフォルト設定 */
    'default' => [
        'className' => 'Cake\Database\Connection'
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => XXX.XXX.XXX.XXX,
        //'port' => 'non_standard_port_number',
        'username' => 'username',
        'password' => 'passwd',
        'database' => 'hoge',
        'encoding' => 'utf8mb4',
        'timezone' => 'Asia/Tokyo',
        'flags' => [],
        'cacheMetadata' => true,
        'log' => false,
                'url' => env('DATABASE_TEST_URL', null),
       ],
    /* fuga */
   'fuga' => [
       'className' => 'Cake\Database\Connection',
       'driver' => 'Cake\Database\Driver\Mysql',
       'persistent' => false,
       'host' => XXX.XXX.XXX.XXX,
       'username' => 'username',
       'password' => 'passwd',
       'database' => 'fuga',
       'encoding' => 'utf8mb4',
       'timezone' => 'Asia/Tokyo',
       'cacheMetadata' => true,
       'quoteIdentifiers' => false,
       'log' => false,
       'url' => env('DATABASE_TEST_URL', null),
   ],
   /* defaultのテスト */
   'test' => [
        'className' => 'Cake\Database\Connection'
        'driver' => 'Cake\Database\Driver\Mysql',
        'persistent' => false,
        'host' => XXX.XXX.XXX.XXX,
        //'port' => 'non_standard_port_number',
        'username' => 'username',
        'password' => 'passwd',
        'database' => 'test',
        'encoding' => 'utf8mb4',
        'timezone' => 'Asia/Tokyo',
        'flags' => [],
        'cacheMetadata' => true,
        'log' => false,
                'url' => env('DATABASE_TEST_URL', null),
       ],
    /* fugaのテスト */
   'test_fuga' => [
       'className' => 'Cake\Database\Connection',
       'driver' => 'Cake\Database\Driver\Mysql',
       'persistent' => false,
       'host' => XXX.XXX.XXX.XXX,
       'username' => 'username',
       'password' => 'passwd',
       'database' => 'test',
       'encoding' => 'utf8mb4',
       'timezone' => 'Asia/Tokyo',
       'cacheMetadata' => true,
       'quoteIdentifiers' => false,
       'log' => false,
       'url' => env('DATABASE_TEST_URL', null),
   ],

テスト時に必要な設定

今回のハマリポイント。fixtureにも向き先を指定してやる必要がありました。
https://github.com/cakephp/cakephp/blob/master/src/TestSuite/Fixture/TestFixture.php#L39
冒頭の公式Doc3回位見つめたけど発見できず...

tests/Fixture/PiyosFixture.php
<?php
namespace App\Test\Fixture;

use Cake\TestSuite\Fixture\TestFixture;

class PiyosFixture extends TestFixture
{

    public $table = 'piyo';
    public $connection = 'test_fuga';

    ()
}

最後に

ぐぐっていたときにCakePHP2には$useDbConfigがあり、fixtureで明示的に指定してあげるという記述を見かけました。
3系では上記の操作に値したようです。
やっぱりDocumentに頼ってばかりじゃなくてちゃんとソースコード読まないとだめですね。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5