まとめ
php artisan tinker
DB::connection()->getConfig();
DB::connection()->getPdo();
接続名も例えば DB::connection('foo')->getConfig();
のようにして指定可能です。
実際にやってみた
root@f4fafbbb539e:/var/www/html# php artisan tinker
Psy Shell v0.9.12 (PHP 7.4.3 — cli) by Justin Hileman
>>> DB::connection()->getConfig();
=> [
"driver" => "pgsql",
"database" => "laravel",
"prefix" => "",
"foreign_key_constraints" => true,
"host" => "db",
"port" => 5432,
"username" => "laravel",
"password" => "secret",
"charset" => "utf8",
"prefix_indexes" => true,
"schema" => "public",
"sslmode" => "prefer",
"name" => "sqlite",
]
>>>
>>> DB::connection()->getPdo();
=> PDO {#3006
inTransaction: false,
attributes: {
CASE: NATURAL,
ERRMODE: EXCEPTION,
PERSISTENT: false,
DRIVER_NAME: "pgsql",
SERVER_INFO: "PID: 105; Client Encoding: UTF8; Is Superuser: on; Session Authorization: laravel; Date Style: ISO, MDY",
ORACLE_NULLS: NATURAL,
CLIENT_VERSION: "11.7 (Debian 11.7-0+deb10u1)",
SERVER_VERSION: "12.2 (Debian 12.2-1.pgdg100+1)",
STATEMENT_CLASS: [
"PDOStatement",
],
EMULATE_PREPARES: false,
CONNECTION_STATUS: "Connection OK; waiting to send.",
DEFAULT_FETCH_MODE: BOTH,
},
}
>>>
今回の例、不思議な接続です。 ドライバー名が pgsql なので PostgreSQL へ接続しています。ホスト名、データベース名、ユーザー名やパスワードももちろん設定されています。 しかし、接続名が sqlite です。 PostgreSQL なのに SQLite 。これは一体どういうことなのでしょう。
Docker コンテナで動かしていますので、コンテナの環境変数を確認してみます。
root@f4fafbbb539e:/var/www/html# printenv
DATABASE_URL=pgsql://laravel:secret@db:5432/laravel?charset=utf8&prefix_indexes=true&schema=public&sslmode=prefer
... 略 ...
APP_ENV=laravel
... 略 ...
root@f4fafbbb539e:/var/www/html#
なるほど、 DATABASE_URL
で config/database.php
の同じ項目を上書きしているのですね。これにより、接続名が何であっても、その接続の DATABASE_URL
を上書きします。
それによって、接続先が PostgreSQL となっています。
また、 APP_ENV=laravel
と環境変数にあります。これは設定ファイルが .env
ではなく、 .env.laravel
であることを意味しています。
このファイルのデータベース設定を見てみます。
root@f4fafbbb539e:/var/www/html# cat .env.laravel
... 略 ...
DB_CONNECTION=sqlite
... 略 ...
root@f4fafbbb539e:/var/www/html#
これだけでした。データベースの指定がなければ、コンテナ内に SQLite 用のファイルを作成してそれを使用する形を狙っているようです。
これで全てわかりました。 DB_CONNECTION
は .env.laravel
設定ファイルの値が使用され、データベースの接続内容は、環境変数で指定した DATABASE_URL
で指定している、ということです。
おわりに
Laravel アプリ最初期には、データベースにうまくつながらないことがよくあります。
そんなときに、本投稿のやり方で、ある程度問題が特定できるかと思います。
以上です。