| この記事の要点 |
|
config/database.php の構造
<?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', '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),
],
],
];
各キーの意味
| キー | 意味 |
|---|---|
driver | DB 種別 (mysql / pgsql / sqlite / sqlsrv) |
host / port | DB サーバ |
database | DB 名 (SQLite では DB ファイルパス) |
username / password | 認証情報 |
charset | 接続文字コード (推奨 utf8mb4) |
collation | 照合順序 |
prefix | テーブル名プレフィックス |
strict | MySQL strict mode (true 推奨) |
engine | 新規テーブルのデフォルト ENGINE (null = InnoDB) |
options | PDO 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: options で SET time_zone を流す or アプリ側で config/app.php の timezone を Asia/Tokyo に。
📸 参考画像
※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。

子ページ
子ページはありません
同階層のページ
- config/database.phpファイル
- .env
- 複数のデータベースに接続する方法
- DBトランザクション
- DBの悲観ロック
人気ページ
- 1 Eclipseで「サーバーに追加または除去できるリソースがありません。」の原因と対処法
- 2 tomcat の起動 / 停止ログと catalina.log・catalina.out の違い
- 3 JavaScript で base URL を取得する方法|window.location.origin
- 4 YouTube Data API v3 エラー一覧|403・400・404 の原因と対処
- 5 Laravel エラー一覧|500/Blade/DB 接続/ルーティングの代表エラー
- 6 3Dグラフィックスとは|モデリング/レンダリング/主要ソフトウェア (Blender / Maya)
- 7 Spring Frameworkのアノテーション一覧
- 8 【Spring】@Valueアノテーションとは
- 9 CATALINA_HOME の確認方法 (Linux / Mac)
- 10 【Spring】@Autowiredアノテーションとは
最近更新/作成されたページ
- プロジェクトをTomcatプロジェクトとして認識させる方法 2026-10-07 22:32:50
- MySQLの1366 Incorrect string value|Laravelの文字コード・絵文字エラー 2026-10-07 21:54:03
- curlの証明書ホスト名不一致|旧エラー51・現行60の確認と対処 2026-10-07 21:54:03
- LaravelのMassAssignmentException|fillableの原因と安全な対処 2026-10-07 21:54:03
- Eclipse で Tomcat の起動ログがコンソールに出ない時の確認手順 2026-10-07 21:54:02
- MySQLにおける中央値(Median)の導き方(バージョン8未満) 2026-10-07 13:49:45
- getInputForward 2026-10-07 13:41:15
- JSONから配列に変換 2026-10-07 13:41:15
- ビューから値をモデルに格納しコントローラーで受け取る方法 2026-10-07 13:23:41
- Laravelのテーブル作成と定義変更|マイグレーション・up/down・注意点 2026-10-07 13:23:41
- NumPy 配列に要素を追加する方法 (append / concatenate) 2026-10-07 13:23:41
- MariaDB・MySQLで現在日時を取得する方法|NOW・タイムゾーン・保存型 2026-10-07 13:13:36
- 【django】テンプレートで定数を使用する方法 2026-10-07 13:10:15
- Spring BootにおけるApplication.propertiesの環境依存設定の分割方法 2026-10-07 12:09:35
- Not supported for DML operations【Springエラー】 2026-10-07 11:09:38