この内容は古いバージョンです。最新バージョンを表示するには、戻るボタンを押してください。
バージョン:10
ページ更新者:T
更新日時:2026-06-11 07:07:02

タイトル: config/database.phpファイル
SEOタイトル: Laravel config/database.php 完全ガイド

この記事の要点
  • Laravel の DB 接続情報を集約: default 接続connections 配列redis
  • 接続種別: mysql / pgsql / sqlite / sqlsrv (drivers)
  • 値は基本 .env から env() で読む — 本番設定をコードに直書きしない
  • charset / collation / prefix / strict mode / options (PDO 設定) を細かく制御可
  • 複数 DB 接続Read/Write 分離が標準サポート
  • php artisan config:cache 後は .env が読まれない (キャッシュ優先)

config/database.php の構造

 env('DB_CONNECTION', 'mysql'),

    'connections' => [
        'mysql' => [
            'driver'         => 'mysql',
            'host'           => env('DB_HOST', '127.0.0.1'),
            'port'           => env('DB_PORT', '3306'),
            'database'       => env('DB_DATABASE', 'forge'),
            'username'       => env('DB_USERNAME', 'forge'),
            'password'       => env('DB_PASSWORD', ''),
            'unix_socket'    => env('DB_SOCKET', ''),
            'charset'        => 'utf8mb4',
            'collation'      => 'utf8mb4_unicode_ci',
            'prefix'         => '',
            'strict'         => true,
            'engine'         => null,
            'options'        => extension_loaded('pdo_mysql') ? array_filter([
                PDO::MYSQL_ATTR_SSL_CA => env('MYSQL_ATTR_SSL_CA'),
            ]) : [],
        ],

        'pgsql' => [
            'driver'   => 'pgsql',
            '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',
            'schema'   => 'public',
            'sslmode'  => 'prefer',
        ],

        'sqlite' => [
            'driver'                  => 'sqlite',
            'database'                => env('DB_DATABASE', database_path('database.sqlite')),
            'prefix'                  => '',
            'foreign_key_constraints' => env('DB_FOREIGN_KEYS', true),
        ],

        'sqlsrv' => [
            'driver'   => 'sqlsrv',
            'host'     => env('DB_HOST', 'localhost'),
            'port'     => env('DB_PORT', '1433'),
            'database' => env('DB_DATABASE', 'forge'),
            'username' => env('DB_USERNAME', 'forge'),
            'password' => env('DB_PASSWORD', ''),
        ],
    ],

    'migrations' => 'migrations',

    'redis' => [
        'client' => env('REDIS_CLIENT', 'phpredis'),
        'default' => [
            'host'     => env('REDIS_HOST', '127.0.0.1'),
            'port'     => env('REDIS_PORT', 6379),
            'database' => env('REDIS_DB', 0),
            'password' => env('REDIS_PASSWORD', null),
        ],
    ],
];

各キーの意味

キー意味
driverDB 種別 (mysql / pgsql / sqlite / sqlsrv)
host / portDB サーバ
databaseDB 名 (SQLite では DB ファイルパス)
username / password認証情報
charset接続文字コード (推奨 utf8mb4)
collation照合順序
prefixテーブル名プレフィックス
strictMySQL strict mode (true 推奨)
engine新規テーブルのデフォルト ENGINE (null = InnoDB)
optionsPDO ATTR (永続接続 / SSL / 等)
schema (pgsql)PostgreSQL のスキーマ名
foreign_key_constraints (sqlite)SQLite で FK を有効化

.env 側

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=mydb
DB_USERNAME=app
DB_PASSWORD=secret

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379

本番では DB_PASSWORD 等を Vault / AWS Secrets Manager から注入するのが安全です。

複数 DB 接続を使う

// config/database.php に 2 つ目の接続を足す
'connections' => [
    'mysql' => [ ... ],
    'mysql_log' => [
        'driver'   => 'mysql',
        'host'     => env('LOG_DB_HOST'),
        'database' => env('LOG_DB_NAME'),
        'username' => env('LOG_DB_USER'),
        'password' => env('LOG_DB_PASS'),
        'charset'  => 'utf8mb4',
    ],
],
// 利用側
DB::connection('mysql_log')->table('access_logs')->insert([...]);

// Eloquent
class AccessLog extends Model
{
    protected $connection = 'mysql_log';
    protected $table = 'access_logs';
}

Read / Write 分離 (マスター・スレーブ構成)

'mysql' => [
    'read' => [
        'host' => [
            '192.168.1.10',
            '192.168.1.11',   // 複数指定で自動ラウンドロビン
        ],
    ],
    'write' => [
        'host' => ['192.168.1.20'],
    ],
    'sticky'   => true,    // 直前に書いたら同セッション中は write 側を読む
    'driver'   => 'mysql',
    'database' => env('DB_DATABASE'),
    'username' => env('DB_USERNAME'),
    'password' => env('DB_PASSWORD'),
    'charset'  => 'utf8mb4',
],

SELECT は read、INSERT/UPDATE/DELETE は write に自動振り分けされます。sticky => true でレプリ遅延を回避できます。

options で PDO を細かく制御

'options' => [
    PDO::ATTR_PERSISTENT       => true,                  // 永続接続
    PDO::ATTR_EMULATE_PREPARES => false,                 // 本物の prepared
    PDO::ATTR_ERRMODE          => PDO::ERRMODE_EXCEPTION,
    PDO::MYSQL_ATTR_INIT_COMMAND => "SET time_zone='+09:00'",

    // SSL
    PDO::MYSQL_ATTR_SSL_CA   => '/etc/mysql/ca.pem',
    PDO::MYSQL_ATTR_SSL_CERT => '/etc/mysql/client-cert.pem',
    PDO::MYSQL_ATTR_SSL_KEY  => '/etc/mysql/client-key.pem',
],

config:cache 時の注意

php artisan config:cache を打つと bootstrap/cache/config.php にキャッシュされ、.env が以後読まれません。デプロイ手順を以下にすること:

# デプロイ手順 (本番)
git pull
composer install --no-dev --optimize-autoloader
php artisan config:clear   # 念のため古いキャッシュ削除
php artisan config:cache   # 新しい .env でキャッシュ作成
php artisan route:cache
php artisan view:cache

FAQ

Q: SQLSTATE[HY000] [1045] Access denied
A: ユーザー名 / パスワード / ホスト名 ミス。MySQL は 'user'@'host' 単位で権限管理されており、localhost / % / 127.0.0.1 で別物扱いになる点に注意。

Q: SQLSTATE[HY000] [2002] Connection refused
A: DB が起動していないか、ポートが違うか、bind-address が localhost のみで Docker から繋がっていない。DB_HOST をコンテナ名 (例: mysql) に。

Q: タイムゾーンが UTC のままで困る
A: optionsSET time_zone を流す or アプリ側で config/app.phptimezone を Asia/Tokyo に。

📸 参考画像

※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。

参考画像