资讯专栏INFORMATION COLUMN

初学 laravel migrate 常见错误解决

plus2047 / 3105人阅读

摘要:提示的这个名称,就是我修改的的文件名称。我们再搜搜正常的文件会在哪些地方出现可见,正常的有个地方出现,修改过的只有个地方出现。果然,执行返回错误。仔细查看语句并没有错误,一想,应该是类型声明和表中的类型不一致造成的吧。

断断续续开始 laravel 入门学习,想整个简单的通讯录系统,设立了两个表,一个 branches ,一个 contacts。
在创建 migration 文件的时候,没有考虑仔细,先把 contacts 表建立了,contacts 表有个外键连接到 branches 的 id,结果执行 migrate 命令的时候,出现以下错误:

[IlluminateDatabaseQueryException]                                                                                        
  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  

初步怀疑是表创建先后不规范造成,于是,手动修改 branches 的 migration 文件名称上的日期,再执行

php artisan migrate:reset

出现如下错误:

  [ErrorException]                                                                                
  include(/Users/Ade/www/laravel_phonebook5.2): failed to open stream: Operation now in progress  
failed to open stream 错误解决

光看错误提示不是很理解,我们查看 laravel 的 log 文件

more storage/logs/laravel.log

找到出现 ERROR 的那段话:

[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): IlluminateFoundationBootstrapHandleExceptions->handleError(2, "include(/Users/...", "/Users/Ade/www/...", 412, Array)
#1 /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php(412): ComposerAutoloadincludeFile()
#2 /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php(301): ComposerAutoloadincludeFile("/Users/Ade/www/...")
#3 [internal function]: ComposerAutoloadClassLoader->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): IlluminateDatabaseMigrationsMigrator->resolve("2016_09_12_1728...")
#6 /Users/Ade/www/laravel_phonebook5.2/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(206): IlluminateDatabaseMigrationsMigrator->runDown(Object(stdClass), false)

错误出现在 ClassLoader.php 文件的 412 行

查看改行代码,发现是一个调用文件的语句:

而这个文件,在 log 文件中已经指出,即 resolve("2016_09_12_1728...") 。log 提示的这个名称,就是我修改的 branch 的 migration 文件名称。

我们再搜搜正常的 migration 文件会在哪些地方出现:

mdfind 2014_10_12_000000_create_users_table.php|grep phonebook

可见,正常的有 3 个地方出现,修改过的只有 1 个地方出现。

编辑这两个未出现的文件

调整 autoload_static.php 文件

发现 vendor/composer/autoload_static.php 文件中,和 branches 相关的语句如下:

"CreateBranchesTable" => __DIR__ .,

想来应该是改名的时候,PHP Storm自动帮我把这个文件里面有关 branches 文件路径全部给删掉了。加回去就好了。

参照正常的 migration 文件名的配置情况,补充为

"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 命令

php artisan migrate:reset  

OK,刚才的错误没了,不过我们又发现 contacts 表没有回滚,

contacts 回滚失败的分析

通过 sequel pro 连上数据库查看

发现 contacts 表果然存在,但是 migration 表中已没有内容,想必再执行前面 migrate 命令的时候出现错误,contacts 的执行记录并没有写入 migrations 表中。
我们可以重新执行 migrate 命令试试看。首先手动删除这两张表,也就是清空数据库,然后执行:

php artisan migrate

我们先忽视创建 contacts 表出现的错误,刷新 sequel pro 查看一下:

果然,migration 表中没有 contacts 的创建记录,这也就难怪执行 reset 的时候,会没有 contacts 的回滚操作了。

contacts 无法创建 branch_id 外键的解决

现在,我们已经执行了 migrate 命令,我们重新来看看这个最早出现的错误:

  [IlluminateDatabaseQueryException]                                                                                                                                                      
  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 错误,我们不妨在 sequel pro 中手工执行一下这条 SQL 语句。

果然,执行返回错误。

仔细查看语句并没有错误,一想,应该是 branch_id 类型声明和 branches 表中的 ID 类型不一致造成的吧。
查看 contacts 的结构,发现 Unsigned 没有打钩,勾选后再执行增加外键的 SQL 语句,成功。

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

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

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

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/30504.html

相关文章

  • windows下laravel5.5手写教程1(适合初学者)

    摘要:打开浏览器输入,如无意外,将出现如下图,表示框架安装成功。四系统内部后台管理系统这个是框架自带的后台登录管理系统,只需要简单的命令即可运行。出现上图即为,创建模型成功。 在PHP个各种web开发框架中,laravel算是一款简洁、优雅的开发框架,本人也刚刚接触到laravel,通过学习大神们的一些文章,下面是我的一些心得体会,希望可以给初学者一些帮助,大家一起进步。言归正传: 本人环境...

    GeekGhc 评论0 收藏0
  • Laravel学习笔记之Demo2——用Ajax来做个ToDoList(待更新)

    摘要:抱歉,最近忙,本篇等有时间更新。引言本文基于框架做的一个生成和存储,主要目的是学习使用框架。书籍基于的,学习时使用框架开发。开发环境备注一直想把这本书的个作为系列分享出来,供初学者学习玩玩。 抱歉,最近忙,本篇等有时间更新。 引言 本文基于Laravel框架做的一个URL生成和存储demo,主要目的是学习使用Laravel框架。内容基于英文书籍《Packt.Laravel.Applic...

    luck 评论0 收藏0
  • Laravel5.4 博客部署到阿里云服务器

    摘要:前边已经学会在本地用进行开发了,现在就让我们将本地开发的项目部署到阿里云服务器,来次实战操作,阿里云部署环境阿里,,使用服务器,登录。 前边已经学会在本地用Homestead进行开发了,现在就让我们将本地开发的项目部署到阿里云服务器,来次实战操作,阿里云部署环境:阿里ECS,Ubuntu,使用Nginx服务器,SSH登录。 一、服务器配置 如果你的服务器是刚申请的,则必须做一些基础的配...

    JowayYoung 评论0 收藏0
  • Laravel 上手教程之实现用户注册和登录

    摘要:在文件的标签中加上以下代码新手上路注册登陆上面只是引用了一些简单的的,也没什么难的,不用伤心。 Laravel身为最优雅的PHP框架,很多学习PHP的小伙伴造就对Laravel垂涎欲滴。今天就来实现你的愿望,让我们一起从零开始,利用Laravel实现Web应用最常见的注册和登录功能!所有的课程源码已放在Github上:laravel-start. Race Start ! 首先我们来...

    stormgens 评论0 收藏0

发表评论

0条评论

plus2047

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<