当方PHP + Laravelを勉強し始め、下記環境情報に記載した環境下で動作検証を行っていますが、
下記に記載した問題が発生しております。
原因、解決方法をご教示しただけたら幸いです。
発生している問題
ローカルに作成したMySQLサーバーにて新規テーブルを作成するために、新たにマイグレーション
ファイルを作成しマイグレーションを実行したところ、テーブルは正しく作成されましたが、
使用したマイグレーションファイルがmigrationsテーブルに登録されません。
作成したマイグレーションファイルをmigrationsテーブルで管理するにはなにか特別な設定が必要なのでしょうか?
なお、全てのマイグレーションファイルが登録されないわけではなく、認証画面の自動作成導入時に
作成された"users"等のマイグレーションファイルは登録されます。
DBへの一部登録も行われていることから、DB接続情報に問題は無いという認識です。
環境情報(FW/ツールのバージョンなど)
- OS : Windows10 Home
- PHP(php -v で確認) : 7.3.20
※PHP 7.3.20 (cli) (built: Jul 7 2020 11:12:26) ( ZTS MSVC15 (Visual C++ 2017) x86 )
- Laravel(php artisan --versionで確認) : 7.19.1
※Laravel Framework 7.19.1
- MySQL(mysql --versionで確認) : 8.0
※C:\Program Files\MySQL\MySQL Server 8.0\bin\mysql.exe Ver 8.0.19 for Win64 on x86_64 (MySQL Community Server - GPL)
マイグレーションファイルの作成~実施手順(booksテーブル)
php artisan make:migration create_books_table --create=books
を実行- 1で作成されたファイルのup()内を適宜修正 (内容は下記に記載)
php artisan migrate
を実行 (エラーメッセージは特に出力されない)
作成したマイグレーションファイル
2020_07_14_133344_create_books_table.php
1<?php 2 3use Illuminate\Database\Migrations\Migration; 4use Illuminate\Database\Schema\Blueprint; 5use Illuminate\Support\Facades\Schema; 6 7class CreateBooksTable extends Migration 8{ 9 /** 10 * Run the migrations. 11 * 12 * @return void 13 */ 14 public function up() 15 { 16 Schema::create('books', function (Blueprint $table) { 17 $table->increments('id'); 18 $table->string('title', 100); 19 $table->string('author', 40)->nullable(); 20 $table->integer('volume')->nullable(); 21 $table->timestamps(); 22 }); 23 } 24 25 /** 26 * Reverse the migrations. 27 * 28 * @return void 29 */ 30 public function down() 31 { 32 Schema::dropIfExists('books'); 33 } 34}
その他マイグレーションファイル、migrate実行後のDB内容
- 作成したマイグレーションファイルを含む全てのファイル
- マイグレーション実施前~実施後のDB
<実施後migrationsテーブル内容> ※作成されたテーブルのうち"books"だけ未登録
試したこと
・freshコマンドでの再実施
php artisan migrate:fresh
を実施し、再度マイグレーションを再実施
→ エラーなく終了するが変化なし
・reset → migrateを実施
php artisan migrate:reset
を実施
→ migrationsテーブルに"books"の情報が入っていないので、"books"のドロップは行われず。(手動でDropを実施)
→ また"books"、"migrations"以外のテーブルはドロップされたが、migrationsテーブルに登録されたレコードのうち"2014_10_12_000000_create_users_table"が削除されず。(手動で削除を実施)
php artisan migrate
を実施
→ 結果は初回時と同じ
※なお上記対応後、migrationsに"2020_07_14_133344_create_books_table"を追加し、migrate:reset
を行ったところ、"books"は削除されましたが、migrationsの"~create_users~"
は残ったままとなりました。
その他情報
今回の動作検証を行う前にLaravelで用意されている認証機能の導入を行いましたcomposer require ※laravel/ui
→ php artisan ui vue --auth
認証画面は正しく表示され、登録画面での登録もエラーなく実施されるのですが、実際には登録内容がusersテーブルに登録されないという問題が発生しています。(未解決)
こちらの現象とも関わりがありそうな気がしますがいかがでしょうか、、、
なお、usersテーブルに登録される内容をdd()で表示し、その内容を手動でusersテーブルに登録したところ、ログインは正常に機能していました。
編集追記1
作成されたマイグレーションファイルを無編集で使うとどうなるのか?っていうのを試すために、
php artisan make:migration create_testdata_table --create=testdata
を実施し、
一切の手を加えずphp artisan migrate
を実施したところ、一つ前に作成している"books"の
マイグレーションファイルはmigrationsに登録され、新規で作成した"testdata"分が未登録となりました。
どこかにマイグレーション対象数を持っている?
編集追記2
MySQLに別名のデータベースを作成し、そちらに対しマイグレーションを実施しましたが、
結果としては編集追記1に記載した内容と同様となりました。
行った作業は以下になります。
(1) MySQLにrootユーザーでログイン
(2) データベース(laraveldb)の作成
CREATE DATABASE laraveldb CHARACTER SET utf8;
(3) test_userに全権限を付与 (test_userは既存ユーザー)
grant all on laraveldb.* to test_user;
(4) .envのDB接続情報を下記の通り修正
実際には"DB_DATABASE"を "laravel_testdb" → "laraveldb"に変更
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laraveldb DB_USERNAME=test_user DB_PASSWORD=******
(5) laraveldbのテーブル数を確認
(6) マイグレーション実施
php artisan migrate
→ エラー (DB接続先の変更が反映されていない模様)
SQLSTATE[42S01]: Base table or view already exists: 1050 Table 'testdata' already exists (SQL: create table `testdata` (`id` bigint unsigned not null auto_increment primary key, `created_at` timestamp null, `updated_at` timestamp null) default character set utf8mb4 collate 'utf8mb4_unicode_ci')
(7) configのキャッシュクリア
php artisan config:clear
(8) マイグレーション実施
php artisan migrate
→ 成功
Migration table created successfully. Migrating: 2014_10_12_000000_create_users_table Migrated: 2014_10_12_000000_create_users_table (1.49 seconds) Migrating: 2014_10_12_100000_create_password_resets_table Migrated: 2014_10_12_100000_create_password_resets_table (1.2 seconds) Migrating: 2019_08_19_000000_create_failed_jobs_table Migrated: 2019_08_19_000000_create_failed_jobs_table (0.71 seconds) Migrating: 2020_07_14_133344_create_books_table Migrated: 2020_07_14_133344_create_books_table (0.49 seconds) Migrating: 2020_07_15_012531_create_testdata_table Migrated: 2020_07_15_012531_create_testdata_table (0.79 seconds)
(10) migrationsテーブル内容確認
→ testdataテーブルのマイグレーションファイルが未登録
(11) マイグレーションステータス確認
php artisan migrate:status
+------+------------------------------------------------+-------+ | Ran? | Migration | Batch | +------+------------------------------------------------+-------+ | Yes | 2014_10_12_000000_create_users_table | 1 | | Yes | 2014_10_12_100000_create_password_resets_table | 1 | | Yes | 2019_08_19_000000_create_failed_jobs_table | 1 | | Yes | 2020_07_14_133344_create_books_table | 1 | | No | 2020_07_15_012531_create_testdata_table | | +------+------------------------------------------------+-------+
以上
編集追記3
上記で問題が発生しているLaravelプロジェクトですが、プロジェクト作成後は標準の認証機能
の導入など行っており、問題の切り分けを行う為に、一度、同じ手順(コマンド)で別のプロジェクトを作成しました。
しかし、結果としては同じ結果となりました。。
(1) Laravelプロジェクト作成
composer create-project laravel/laravel --prefer-dist BookManager
(2) .envのDB接続情報を設定
DB_CONNECTION=mysql DB_HOST=127.0.0.1 DB_PORT=3306 DB_DATABASE=laraveldb DB_USERNAME=test_user DB_PASSWORD=******
(3) booksテーブルのマイグレーションファイル作成
php artisan make:migration create_books_table --create=books
<実行後>
(4) マイグレーション実施
php artisan migrate
<実行後>
以上
編集追記4
Laravelのバージョンを6.xでプロジェクトを作成してみましたが結果は同じでした。
composer create-project laravel/laravel=6.* --prefer-dist BookManager
回答2件
あなたの回答
tips
プレビュー