はじめに
LaravelをDocker上に構築し、マイグレーション処理を試みた際、MySQLにテーブルが作成されない問題に遭遇しました。
個人の備忘録程度の走り書きとなっておりますが、温かい目で見守っていただければ幸いです。
本記事はその原因と解決までの過程をまとめた、PHP学習初心者の備忘録です。
書こうと思ったきっかけ
個人的にPHPのキャッチアップをしたくてDocker + Laravel環境を構築中、artisan migrate
は成功しているのに MySQL の中にテーブルが見えないという現象に悩まされました。
実際の事象
調べてわかったことを整理して残しておきたいと思い、この記事を書きました。
内容
問題の現象
-
php artisan migrate
は成功した(messages
テーブルも Ran 表示)。 - しかし
mysql
にログインしてSHOW TABLES;
を実行すると空。
原因の特定
-
.env
の中身を確認したところ、以下のようにDB_CONNECTION=sqlite
になっていた:
DB_CONNECTION=sqlite
- Laravel はこの設定をもとに SQLite にマイグレーションしていた。
正しい設定への修正
.env
を以下のように修正:
DB_CONNECTION=mysql
DB_HOST=db
DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=laravel
DB_PASSWORD=secret
さらに、設定変更を反映させるために以下を実行:
make cache-clear
make migrate:fresh
実際のMakefile
# Laravelのキャッシュをすべてクリアする
cache-clear:
docker exec -it php-app php artisan config:clear
docker exec -it php-app php artisan route:clear
docker exec -it php-app php artisan view:clear
# マイグレーションを実行する
migrate:
docker compose exec php-app php artisan migrate
# 指定テーブルが存在するかを確認する(true が返ればOK)
check-table:
docker compose exec php-app php artisan tinker --execute="\Schema::hasTable('messages');"
その後、MySQLに入り直して SHOW TABLES;
を実行すると messages
テーブルを含む一覧が正しく表示されました。
実際の画面
まとめ
Laravelが使用するデータベースは .env
ファイルで決まるため、Dockerなどの仮想環境下で構築する際は .env
の DB_HOST
や DB_CONNECTION
の設定に特に注意が必要です。
今回は sqlite
になっていたために、MySQLにテーブルが現れないという状態でした。
今後は環境構築直後に .env
を確認し、Laravelと接続するDBが意図したものになっているかをチェックするようにします...!