タイトル: config/database.phpファイル
SEOタイトル: Laravel config/database.php 完全ガイド
| この記事の要点 |
|
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),
],
],
];
各キーの意味
| キー | 意味 |
|---|---|
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 に。
📸 参考画像
※ 旧バージョンから引き継いだ参考画像です。手順・図解の補助としてご覧ください。
