ホームページ  >  記事  >  PHPフレームワーク  >  Laravel の移行でよくあるエラーの概要

Laravel の移行でよくあるエラーの概要

藏色散人
藏色散人転載
2022-01-05 16:07:262291ブラウズ

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

エラーメッセージを見ただけではよくわかりませんので、laravelのログファイルを確認してみましょう

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)

エラーは ClassLoader.php ファイルの 412 行目に表示されます


変更されたコードを確認すると、次のことがわかりました。ファイルを呼び出すステートメントである:

Laravel の移行でよくあるエラーの概要

このファイルは、ログ ファイルで指摘されています。つまり、

resolve('2016_09_12_1728...') です。ログに表示される名前は、変更したブランチの移行ファイルの名前です。

通常の移行ファイルが表示される場所を検索してみましょう:

mdfind 2014_10_12_000000_create_users_table.php|grep phonebook

Laravel の移行でよくあるエラーの概要

通常の移行ファイルが表示される場所が 3 か所あることがわかります。 1箇所に登場しました。


表示されない 2 つのファイルを編集します


autoload_static.php ファイルを調整します

vendor/composer/autoload_static.php ファイルで、ブランチに関連するステートメントが次のとおりであることがわかりました。

'CreateBranchesTable' => __DIR__ .,

名前を変更したときだったと思いますが、PHP Storm が自動的にすべての削除を手伝ってくれました。このファイル内のブランチ ファイル パスが失われています。あとは追加するだけです。

通常の移行ファイル名の設定を参照して、次の行を追加します。

'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、先ほどのエラーは解消されましたが、連絡先テーブルがロールバックされていないことがわかりました。Laravel の移行でよくあるエラーの概要


失敗した分析連絡先のロールバック


Sequell Pro を介してデータベースに接続して表示します

連絡先テーブルが次のことを行っていることがわかります。存在しますが、移行テーブルにコンテンツがありません。前の移行を再度実行する必要があります。 コマンド中にエラーが発生し、連絡先の実行レコードが移行テーブルに書き込まれませんでした。移行コマンドを再実行して試してみます。まず、これら 2 つのテーブルを手動で削除します。つまり、データベースをクリアしてから、次を実行します。 Laravel の移行でよくあるエラーの概要

php artisan migrate

contacts テーブルの作成時のエラーを無視し、Sequential Pro を更新して、次のことを確認します。

案の定、移行テーブルには連絡先の作成記録がありません。そのため、リセットの実行時に連絡先のロールバック操作は行われません。 Laravel の移行でよくあるエラーの概要


contacts Branch_id 外部キー ソリューションを作成できません

移行コマンドを実行したので、もう一度始めましょう。この最初のエラーを見てください:

[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

落ち着いて分析してください。プロンプトは SQL エラーであるため、この SQL ステートメントを Sequential Pro で手動で実行することもできます。

案の定、実行によりエラーが返されました。 Laravel の移行でよくあるエラーの概要

ステートメントを注意深く確認してください。エラーはありません。最初に考えられるのは、branch_id 型の宣言と、branch テーブルの ID 型の不一致が原因であると考えられます。連絡先の構造を確認し、Unsigned にチェックが入っていないことを確認し、SQL 文を実行して外部キーを追加すると成功します。

Laravel の移行でよくあるエラーの概要

找到问题原因后,我们就清空数据库,修改 contacts 的 migration 文件,调整 branch_id 为:

$table->integer('branch_id')->unsigned()->comment('机构ID');

再重新执行 migrate 命令,成功!

Laravel の移行でよくあるエラーの概要

相关推荐:最新的五个Laravel视频教程

以上がLaravel の移行でよくあるエラーの概要の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はjb51.netで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。