Yii2 + PostgreSQL で public 以外のスキーマにアプリで使用するテーブルを置きたい場合、\config\db.php を以下のように設定すると良い。
\config\db.php
<?php
return [
'class' => yii\db\Connection::class,
'dsn' => 'pgsql:host=myhost;port=5432;dbname=mydb;options=--search_path=myschema,public',
'username' => 'xxxxx',
'password' => 'yyyyy',
'charset' => 'utf8',
'schemaMap' => [
'pgsql' => [
'class' => yii\db\pgsql\Schema::class,
'defaultSchema' => 'myschema',
],
],
'enableSchemaCache' => !YII_DEBUG,
'schemaCacheDuration' => 60,
'schemaCache' => 'cache',
];
ポイントは2つ。
-
schemaMapのdefaultSchemaにmyschemaを設定する -
dsnのoptionsにsearch_pathを設定して、myschemaを優先的に探すようにする
defaultSchema の設定は Yii2 の各種コンポーネントのレベルで効果を持つ。例えば、Migration の履歴管理テーブル、Session テーブル、その他の ActiveRecord テーブルにおいて、スキーマを明示しない場合は myschema がデフォルトとして使用されるようになる。例えば、user テーブルは myschema.user テーブルとして解釈される。
search_path の設定は PostgreSQL のコマンドのレベルで効果を持つ。これを設定すると、低レベルで直接的にデータベースにアクセスするコンポーネントにおいて、スキーマを明示しないテーブルのデフォルトのスキーマが決定される。例えば、migration でスキーマを明示せずに指定したテーブルが myschema の下に作成される。RBAC においても、auth_item 等のテーブルが myschema 下にあるものとして扱われる。