タイトル: データベースの設定
SEOタイトル: Laravel データベース設定完全ガイド(.env / config/database.php / 複数 DB 接続)
| この記事の要点 |
|
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 ドライバ
| DB | driver | 必須拡張 | 用途 |
|---|---|---|---|
| MySQL / MariaDB | mysql | pdo_mysql | Web 系の標準 |
| PostgreSQL | pgsql | pdo_pgsql | 厳密な型、JSON / 配列 / 全文検索が強い |
| SQLite | sqlite | pdo_sqlite | テスト / ローカル開発 / 小規模アプリ |
| SQL Server | sqlsrv | pdo_sqlsrv | Windows / 既存 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
| 項目 | 推奨値 | 備考 |
|---|---|---|
| charset | utf8mb4 | 絵文字 (4 byte 文字) 対応必須 |
| collation | utf8mb4_unicode_ci | 多言語対応の標準ソート |
| prefix | 空 or app_ | 共有 DB で衝突回避時のみ使用 |
| engine | InnoDB | トランザクション・外部キー対応 |
接続確認
# tinker で確認
php artisan tinker
>>> DB::connection()->getPdo()
=> PDO {#... }
>>> DB::connection('mysql_report')->getPdo()
=> PDO {#... }
# マイグレーションで確認
php artisan migrate:status
よくあるトラブル
| 症状 | 原因 | 対処 |
|---|---|---|
SQLSTATE[HY000] [2002] Connection refused | DB 未起動 / ホスト名間違い | systemctl start mysql / DB_HOST 確認 |
could not find driver | PHP 拡張未インストール | 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.production に DB_CONNECTION=pgsql、ローカル .env に DB_CONNECTION=sqlite という運用が定番です。
Q: prefix を後から付けたい
A: 既存テーブルがある状態で prefix を変えると参照できなくなります。マイグレーションでリネームしてから設定変更が安全です。