カテゴリー
Linux

Laravel 6 で今データベース接続がどうなっているか簡単に確認する方法

まとめ

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_URLconfig/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 アプリ最初期には、データベースにうまくつながらないことがよくあります。

そんなときに、本投稿のやり方で、ある程度問題が特定できるかと思います。

以上です。

コメントを残す