8.

Laravel データベース設定完全ガイド(.env / config/database.php / 複数 DB 接続)

編集
この記事の要点
  • Laravel の DB 接続は config/database.phpconnections 配列で定義、値の実体は .env から注入
  • .envDB_CONNECTION / DB_HOST / DB_PORT / DB_DATABASE / DB_USERNAME / DB_PASSWORD が基本セット
  • MySQL / PostgreSQL / SQLite / SQL Server の 4 種類が標準サポート。SQLite は database/database.sqlite を touch するだけ
  • 複数 DB 接続は DB::connection("mysql2")->table(...)、Eloquent は $connection = "mysql2"
  • utf8mb4 + utf8mb4_unicode_ci を必ず指定(絵文字対応・MySQL)

config/database.php の構造

Laravel の DB 設定は 2 階建てです: config/database.php で接続定義 + .env で実値を注入。

// config/database.php
return [
    'default' => 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', 'laravel'),
            'username'  => env('DB_USERNAME', 'root'),
            'password'  => env('DB_PASSWORD', ''),
            'charset'   => 'utf8mb4',
            'collation' => 'utf8mb4_unicode_ci',
            'prefix'    => '',
            'strict'    => true,
            'engine'    => 'InnoDB',
        ],

        'pgsql' => [
            'driver'   => 'pgsql',
            'host'     => env('DB_HOST', '127.0.0.1'),
            'port'     => env('DB_PORT', '5432'),
            'database' => env('DB_DATABASE'),
            'charset'  => 'utf8',
            'schema'   => 'public',
            'sslmode'  => 'prefer',
        ],

        'sqlite' => [
            'driver'   => 'sqlite',
            'database' => database_path('database.sqlite'),
            'prefix'   => '',
        ],
    ],
];

.env の書き方

# .env (MySQL)
DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=myapp
DB_USERNAME=root
DB_PASSWORD=secret

# .env (PostgreSQL)
DB_CONNECTION=pgsql
DB_HOST=db.example.com
DB_PORT=5432
DB_DATABASE=myapp
DB_USERNAME=postgres
DB_PASSWORD=postgres

# .env (SQLite)
DB_CONNECTION=sqlite
# database/database.sqlite を touch するだけ

.env を変更したら必ずキャッシュクリア:

php artisan config:clear
php artisan config:cache    # 本番ではキャッシュ

4 種類の DB ドライバ

DBdriver必須拡張用途
MySQL / MariaDBmysqlpdo_mysqlWeb 系の標準
PostgreSQLpgsqlpdo_pgsql厳密な型、JSON / 配列 / 全文検索が強い
SQLitesqlitepdo_sqliteテスト / ローカル開発 / 小規模アプリ
SQL Serversqlsrvpdo_sqlsrvWindows / 既存 SQL Server 連携

SQLite で素早く始める

# 1. ファイルを作るだけ
touch database/database.sqlite

# 2. .env を書き換え
# DB_CONNECTION=sqlite
# DB_HOST / DB_PORT / DB_DATABASE / DB_USERNAME / DB_PASSWORD は不要(コメントアウト可)

# 3. マイグレーション
php artisan migrate

複数 DB 接続を使う

レポート用 DB が別サーバ、メインは MySQL、集計は PostgreSQL、といった構成も簡単です:

// config/database.php の connections に追加
'mysql_report' => [
    'driver'    => 'mysql',
    'host'      => env('DB_REPORT_HOST'),
    'database'  => env('DB_REPORT_DATABASE'),
    'username'  => env('DB_REPORT_USERNAME'),
    'password'  => env('DB_REPORT_PASSWORD'),
    'charset'   => 'utf8mb4',
],
# .env
DB_REPORT_HOST=report-db.example.com
DB_REPORT_DATABASE=report
DB_REPORT_USERNAME=reader
DB_REPORT_PASSWORD=xxx
// 使う側: Query Builder
$rows = DB::connection('mysql_report')
    ->table('daily_sales')
    ->where('date', '2026-01-01')
    ->get();

// Eloquent
class Sale extends Model
{
    protected $connection = 'mysql_report';
    protected $table = 'daily_sales';
}

// マイグレーション
Schema::connection('mysql_report')->create('daily_sales', function (Blueprint $table) {
    $table->id();
    $table->date('date');
    $table->integer('amount');
});

Read / Write を分ける(読み書き分離)

マスター・スレーブ構成で参照を slave に流したい場合は read / write キーで分離できます:

'mysql' => [
    'driver' => 'mysql',
    'read' => [
        'host' => [
            'slave1.example.com',
            'slave2.example.com',
        ],
    ],
    'write' => [
        'host' => 'master.example.com',
    ],
    'sticky'    => true,  // 同一リクエスト内の書き込み後は read も master へ
    'database'  => 'myapp',
    'username'  => 'app',
    'password'  => env('DB_PASSWORD'),
    'charset'   => 'utf8mb4',
    'collation' => 'utf8mb4_unicode_ci',
],

テーブル prefix と charset

項目推奨値備考
charsetutf8mb4絵文字 (4 byte 文字) 対応必須
collationutf8mb4_unicode_ci多言語対応の標準ソート
prefix空 or app_共有 DB で衝突回避時のみ使用
engineInnoDBトランザクション・外部キー対応

接続確認

# tinker で確認
php artisan tinker
>>> DB::connection()->getPdo()
=> PDO {#... }

>>> DB::connection('mysql_report')->getPdo()
=> PDO {#... }

# マイグレーションで確認
php artisan migrate:status

よくあるトラブル

症状原因対処
SQLSTATE[HY000] [2002] Connection refusedDB 未起動 / ホスト名間違いsystemctl start mysql / DB_HOST 確認
could not find driverPHP 拡張未インストールapt install php-mysql
Specified key was too long (utf8mb4 + index)InnoDB 旧バージョンAppServiceProvider::boot()Schema::defaultStringLength(191)
.env 変更が効かないconfig キャッシュphp artisan config:clear

FAQ

Q: パスワードを .env に書きたくない
A: AWS Secrets Manager / HashiCorp Vault と連携、または環境変数で OS 側から注入してください。

Q: 本番でだけ別 DB に切り替えたい
A: .env.productionDB_CONNECTION=pgsql、ローカル .envDB_CONNECTION=sqlite という運用が定番です。

Q: prefix を後から付けたい
A: 既存テーブルがある状態で prefix を変えると参照できなくなります。マイグレーションでリネームしてから設定変更が安全です。

編集
Post Share
子ページ
  1. config/database.phpファイル
  2. .env
  3. 複数のデータベースに接続する方法
  4. DBトランザクション
  5. DBの悲観ロック
同階層のページ
  1. インストールと設定
  2. クイックスタート & チュートリアル(初心者向け)
  3. クイックスタート & チュートリアル(中級者向け)
  4. ルーティング
  5. Bladeテンプレート(ビュー/レイアウト)
  6. コントローラー
  7. マイグレーションとテーブル定義
  8. データベースの設定
  9. Eloquentモデル (ORM)
  10. SQLとクエリビルダー
  11. バリデーション
  12. .envファイルの設定値へのアクセス
  13. 動作環境による分岐処理
  14. configフォルダ配下の設定値へのアクセス
  15. assetヘルパーを利用したpublicフォルダへのアクセス
  16. storageフォルダへのアクセス
  17. アプリケーション名の変更
  18. メンテナンス
  19. ログイン画面(認証システム)の作成
  20. ログインの必須化
  21. ログインユーザー情報の取得
  22. ルートの認証化
  23. 本番サーバーへのデプロイ方法
  24. 多言語化
  25. csrf_field
  26. ファイルのダウンロード
  27. CSVのアップロードおよび読み込み(maatwebsite/excel)
  28. ページタイトルの設定
  29. コマンド一覧
  30. エラー一覧
  31. SQLの実行ログ出力方法
  32. キャッシュのクリア
  33. Selectの結果の最初もしくは最後に任意の値を追加する方法
  34. ajaxでPOST通信する際の注意点
  35. ソーシャルログインの実装
  36. セッション情報の確認
  37. ログイン、ユーザー登録、パスワードリセット後のリダイレクト先の変更方法
  38. redirectやreturn viewにメッセージを付与する方法
  39. クッキー(cookie)の設定と取得
  40. クラスの再読み込み
  41. csrfの有効時間を変更する方法
  42. ViewComposerを用いてviewに共通の値を付与する方法
  43. View::shareを用いて共通の値を各ビューに渡す方法
  44. ミドルウェアを用いた処理の共通化
  45. Middleware内でAuth::check()などを使用する方法
  46. Controller以外でリダイレクトする方法
  47. セッションの値の取得/保存/更新/削除
  48. $requestの値を変更する方法
  49. 常時SSL化
  50. ページング(ページネーション)をする方法
  51. vue.jsとの連携
  52. Vue.jsと連携するSPA実行環境構築
  53. .envの値をvue.jsで参照する方法
  54. vue.jsを本番環境にリリースする方法
  55. could not find driver(Windows, MySQL編)