间歇性开始laravel入门学习,想着整个简单的通讯录系统,设置两张表,一张分支,一张联系人。创建迁移文件时,我没有仔细考虑。我首先创建了联系人表。联系人表有一个连接到分支机构ID的外键。结果执行migrate命令的时候出现了如下错误:[Illuminate\Database\QueryException]SQLSTATE[HY000]:Generalerror:1215Cannotaddforeignkeyconstraint(SQL:altertable`contacts`addconstraint`contacts_branch_id_foreign`foreignkey(`branch_id`)references`branches`(`id`)ondeletecascade)[PDOException]SQLSTATE[HY000]:Generalerror:intpreliminarycreationofaforeignkeytable是先后不规范造成的,所以手动修改branches迁移文件名称上的日期,然后执行phpartisanmigrate:reset出现如下错误:[ErrorException]include(/Users/Ade/www/laravel_phonebook5.2):failedtoopenstream:Operationnowinprogressfailedtoopenstream错误解决光看错误信息不是很明白,我们查laravel的日志文件morestorage/logs/laravel.log找到ERROR出现的段落:[2016-09-2918:05:35]local.ERROR:exception'ErrorException'withmessage'include(/Users/Ade/www/laravel_phonebook5.2):failedtoopenstream:Operationnowinprogress'in/Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php:412Stacktrace:#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[internalfunction]: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/阿德/www/laravel_phonebook5.2/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(227):Illuminate\Database\Migrations\Migrator->resolve('2016_09_12_1728...')#6/用户/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行。查看改行的代码,发现是一条调用file:的语句,并且日志文件中已经指出了这个文件,即resolve('2016_09_12_1728...')日志提示的名称就是该文件的名称我修改的分支的迁移文件。我们搜索一下正常的迁移文件会出现在哪里:mdfind2014_10_12_000000_create_users_table.php|grepphonebook显示有3处出现正常的迁移文件,只有1处出现修改后的文件。编辑这两个没有出现的文件,调整autoload_static.php文件。在vendor/composer/autoload_static.php文件中,分支相关语句如下:'CreateBranchesTable'=>__DIR__。PHPStorm自动帮我删除了这个文件中所有相关的分支文件路径时应该重命名了。加回去就好了。参考正常迁移文件名的配置,添加'CreateBranchesTable'=>__DIR__.'/../..'.'/database/migrations/2016_09_12_172822_create_branches_table.php',调整autoload_classmap.php文件我们找到了autoload_classmap。php文件,branches的路径名还是修改前的路径:'CreateBranchesTable'=>$baseDir.'/database/migrations/2016_09_29_172822_create_branches_table.php',修改为'CreateBranchesTable'=>$baseDir.'/database/migrations/2016_09_12_172822_create_branches_table.php',然后执行migrate命令phpartisanmigrate:resetOK,刚才的错误没有了,但是我们发现contacts表并没有回滚,通过连接查看contacts回滚失败的分析通过sequelpro到数据库。发现contacts表确实存在,但是migration表中没有内容,推测是之前执行migrate命令时出错,contacts的执行记录还没有写入migrations表中。我们可以尝试再次执行迁移命令。先手动删除这两个表,也就是清空数据库,然后执行:phppartisanmigrate先忽略创建contacts表的错误,刷新sequelpro查看:果然migration表中没有contacts的创建记录,所以难怪执行reset的时候,不会有contacts的回滚操作。Contactscannotcreateabranch_idforeignkey解决方法既然我们已经执行了migrate命令,让我们重新回顾一下最早的错误:[Illuminate\Database\QueryException]SQLSTATE[HY000]:Generalerror:1215Cannotaddforeignkeyconstraint(SQL:altertable`contacts`addconstraint`contacts_branch_id_foreign`foreignkey(`branch_id`)references`branches`(`id`)onupdatecascade)[PDOException]SQLSTATE[HY000]:Generalerror:1215Cannotaddforeignkeyconstraint冷静分析,既然提示是SQL错误,我们不妨在sequelpro中手动执行这条SQL语句.果然,执行返回了一个错误。仔细检查语句,没有错误。想了想,应该是branch_id类型声明和branches表中的ID类型不一致导致的。查看contacts的结构,发现Unsigned没有勾选,勾选后执行添加外键的SQL语句,成功。找到问题原因后,我们清空数据库,修改contacts的迁移文件,将branch_id调整为:$table->integer('branch_id')->unsigned()->comment('organizationID');然后重新执行迁移命令,成功!
