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

タイトル: データベースの設定
SEOタイトル: 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 を変えると参照できなくなります。マイグレーションでリネームしてから設定変更が安全です。