Laravel の次のチュートリアル コラムでは、laravel 移行の初心者向けに、よくある間違いと解決策をいくつか紹介します。
まえがき
最近、断続的にlaravelを勉強し始めたのですが、簡単なアドレス帳システムを作成して、テーブルを2つ用意したいと思っています。支店用と連絡先用です。移行ファイルを作成する際、よく考えずに最初に連絡先テーブルを作成してしまいました。連絡先テーブルにはブランチの ID に接続された外部キーがありました。その結果、移行コマンドを実行すると、次のエラーが発生しました:[Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `contacts` add constraint `contac ts_branch_id_foreign` foreign key (`branch_id`) references `branches` (`id`) on delete cascade) [PDOException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
php artisan migrate:reset
[ErrorException] include(/Users/Ade/www/laravel_phonebook5.2): failed to open stream: Operation now in progress
failed to open Stream errorsolution
more storage/logs/laravel.log
[2016-09-29 18:05:35] local.ERROR: exception 'ErrorException' with message 'include(/Users/Ade/www/laravel_phonebook5.2): failed to open stream: Operation now in progress' in /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php:412 Stack trace: #0 /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php(412): Illuminate\Foundation\Bootstrap\HandleExceptions->handleError(2, 'include(/Users/...', '/Users/Ade/www/...', 412, Array) #1 /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php(412): Composer\Autoload\includeFile() #2 /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php(301): Composer\Autoload\includeFile('/Users/Ade/www/...') #3 [internal function]: Composer\Autoload\ClassLoader->loadClass('CreateBranchesT...') #4 /Users/Ade/www/laravel_phonebook5.2/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(335): spl_autoload_call('CreateBranchesT...') #5 /Users/Ade/www/laravel_phonebook5.2/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(227): Illuminate\Database\Migrations\Migrator->resolve('2016_09_12_1728...') #6 /Users/Ade/www/laravel_phonebook5.2/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(206): Illuminate\Database\Migrations\Migrator->runDown(Object(stdClass), false)
resolve('2016_09_12_1728...') です。ログに表示される名前は、変更したブランチの移行ファイルの名前です。
mdfind 2014_10_12_000000_create_users_table.php|grep phonebook
autoload_static.php ファイルを調整します
'CreateBranchesTable' => __DIR__ .,
通常の移行ファイル名の設定を参照して、次の行を追加します。
'CreateBranchesTable' => __DIR__ . '/../..' . '/database/migrations/2016_09_12_172822_create_branches_table.php',
autoload_classmap.php ファイルを調整します
# #autoload_classmap.php ファイルで、ブランチのパス名が変更前のパスのままであることがわかりました。
'CreateBranchesTable' => $baseDir . '/database/migrations/2016_09_29_172822_create_branches_table.php',
これを
'CreateBranchesTable' => $baseDir . '/database/migrations/2016_09_12_172822_create_branches_table.php',
に変更し、移行コマンド
php artisan migrate:reset
##OK、先ほどのエラーは解消されましたが、連絡先テーブルがロールバックされていないことがわかりました。
Sequell Pro を介してデータベースに接続して表示します
連絡先テーブルが次のことを行っていることがわかります。存在しますが、移行テーブルにコンテンツがありません。前の移行を再度実行する必要があります。 コマンド中にエラーが発生し、連絡先の実行レコードが移行テーブルに書き込まれませんでした。移行コマンドを再実行して試してみます。まず、これら 2 つのテーブルを手動で削除します。つまり、データベースをクリアしてから、次を実行します。
php artisan migrate
案の定、移行テーブルには連絡先の作成記録がありません。そのため、リセットの実行時に連絡先のロールバック操作は行われません。
移行コマンドを実行したので、もう一度始めましょう。この最初のエラーを見てください:
[Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `contacts` add constraint `contacts_branch_id_foreign` foreign key (`branch_id`) references `br anches` (`id`) on update cascade) [PDOException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
案の定、実行によりエラーが返されました。
ステートメントを注意深く確認してください。エラーはありません。最初に考えられるのは、branch_id 型の宣言と、branch テーブルの ID 型の不一致が原因であると考えられます。連絡先の構造を確認し、Unsigned にチェックが入っていないことを確認し、SQL 文を実行して外部キーを追加すると成功します。
找到问题原因后,我们就清空数据库,修改 contacts 的 migration 文件,调整 branch_id 为:
$table->integer('branch_id')->unsigned()->comment('机构ID');
再重新执行 migrate 命令,成功!
相关推荐:最新的五个Laravel视频教程
以上がLaravel の移行でよくあるエラーの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。