はじめに
PostgreSQLには、DBとテーブルの間にスキーマという概念があります。
今回、同じDB内でスキーマを切り替える処理を学んだので、残しておきます。
結論
database.phpに、スキーマ名だけを変えたDB設定を違う名前で書いておいて、
DB::connectionであたかもDBを切り替えるようにして、スキーマだけを切り替える。
初期状態
初期状態はpublicスキーマが指定されてます。
database.php
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
],
実装
通常の設定の下にスキーマのところだけtestに変えた、
別名の設定(ここではpgsqltest)を書いておく。
(実際の実装では、スキーマの指定はenvヘルパで指定しました。)
database.php
'pgsql' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'public',
'sslmode' => 'prefer',
],
'pgsqltest' => [
'driver' => 'pgsql',
'url' => env('DATABASE_URL'),
'host' => env('DB_HOST', '127.0.0.1'),
'port' => env('DB_PORT', '5432'),
'database' => env('DB_DATABASE', 'forge'),
'username' => env('DB_USERNAME', 'forge'),
'password' => env('DB_PASSWORD', ''),
'charset' => 'utf8',
'prefix' => '',
'prefix_indexes' => true,
'schema' => 'test',
'sslmode' => 'prefer',
],
利用
以上で設定は完了です。
あとは下記のように通常でない方を利用するときのみ、
DB::connectionで切り替えるだけです。
TestController.php
$accounts = \DB::connection('pgsqltest')
->table('account')
->get();
まとめ
今までMySQLばかり使っていたので、あまり馴染みがないやり方でした。
正直他にも良い方法があったら知りたいです。
スキーマに関して調べて見ると、スキーママネージャー(下記)のようなものがあったので、
こういうのを追加しないと、スキーマを操作するのは難しいのかなという印象です。