##経緯
既存のusersテーブルにカラムを追加しようとして、以下を実行。
ターミナル
$ php artisan make:migration add_columns_share_id_to_user_table --table=user
作成されたファイルを次のように修正。
2021_06_18_180516_add_columns_share_id_to_user_table.php
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
class AddColumnsShareIdToUserTable extends Migration
{
// 〜省略〜
public function up()
{
Schema::table('user', function (Blueprint $table) {
$table->string('share_id', 8); //追加
});
}
// 〜省略〜
public function down()
{
Schema::table('user', function (Blueprint $table) {
$table->dropColumn('share_id'); //追加
});
}
}
ターミナル
$ php artisan migrate
ファイル修正後に上記を実行したらエラー発生。
##エラー内容(1)
ターミナル
Illuminate\Database\QueryException : SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.user' doesn't exist (SQL: alter table `user` add `share_id` varchar(8) not null)
at /Applications/MAMP/htdocs/プロジェクト名/vendor/laravel/framework/src/Illuminate/Database/Connection.php:669
665| // If an exception occurs when attempting to run a query, we'll format the error
666| // message to include the bindings with SQL, which will make this exception a
667| // lot more helpful to the developer instead of just the database's errors.
668| catch (Exception $e) {
> 669| throw new QueryException(
670| $query, $this->prepareBindings($bindings), $e
##対応(1)
見直してみると、最初にターミナルでマイグレーションファイルを作成したときに、テーブル名を間違えています。
以下のようにファイルを修正。
2021_06_18_180516_add_columns_share_id_to_users_table.php
// ↑ファイル名をuserからusersに変更しています。
// 〜省略〜
class AddColumnsShareIdToUserTable extends Migration
{
// 〜省略〜
public function up()
{
Schema::table('users', function (Blueprint $table) { // ←userからusersに変更
$table->string('share_id', 8);
});
}
// 〜省略〜
public function down()
{
Schema::table('user', function (Blueprint $table) { // ←userからusersに変更
$table->dropColumn('share_id');
});
}
}
修正後、composer dump-autoloadを実行した後に、再度php artisan migrateを実行。
ターミナル
$ composer dump-autoload
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: barryvdh/laravel-debugbar
Discovered Package: facade/ignition
Discovered Package: fideloper/proxy
Discovered Package: laravel/tinker
Discovered Package: laravel/ui
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.
Generated optimized autoload files containing 4960 classes
$ php artisan migrate
しかし、再度エラー発生。
エラー内容は先ほどから変わっています。
##エラー内容(2)
ターミナル
Symfony\Component\Debug\Exception\FatalThrowableError : Class 'AddColumnsShareIdToUsersTable' not found
at /Applications/MAMP/htdocs/プロジェクト名/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:453
449| public function resolve($file)
450| {
451| $class = Str::studly(implode('_', array_slice(explode('_', $file), 4)));
452|
> 453| return new $class;
454| }
455|
456| /**
457| * Get all of the migration files in a given path.
Exception trace:
1 Illuminate\Database\Migrations\Migrator::resolve("2021_06_18_180516_add_columns_share_id_to_users_table")
/Applications/MAMP/htdocs/プロジェクト名/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:189
2 Illuminate\Database\Migrations\Migrator::runUp("/Applications/MAMP/htdocs/プロジェクト名/database/migrations/2021_06_18_180516_add_columns_share_id_to_users_table.php")
/Applications/MAMP/htdocs/プロジェクト名/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php:165
Please use the argument -v to see more details.
##対応(2)
よくよく見直すと、あと一ヶ所間違っているところがありました。
2021_06_18_180516_add_columns_share_id_to_users_table.php
// 〜省略〜
class AddColumnsShareIdToUsersTable extends Migration // ここです。User→Users
{
// 〜省略〜
上記を修正した後に再度 composer dump-autoloadを実行し、php artisan migrateを実行したら無事成功しました。
##まとめ
マイグレーションファイルを作成するときにテーブル名を間違えた場合は、
- ファイル名
- コード
- class
- public function up()
- public function down()
の4ヶ所を修正し、composer dump-autoloadを実行すると改善する。
今後は、ターミナルでコマンドを実行する時は、もっとしっかり確認しようと思います。