laravel migrate初学常见错误的解决方法


Posted in PHP onOctober 11, 2017

前言

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

[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

初步怀疑是表创建先后不规范造成,于是,手动修改 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): 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 migrate初学常见错误的解决方法

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

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

mdfind 2014_10_12_000000_create_users_table.php|grep phonebook

laravel migrate初学常见错误的解决方法

可见,正常的有 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

laravel migrate初学常见错误的解决方法

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

contacts 回滚失败的分析

通过 sequel pro 连上数据库查看

laravel migrate初学常见错误的解决方法

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

php artisan migrate

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

laravel migrate初学常见错误的解决方法

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

contacts 无法创建 branch_id 外键的解决

现在,我们已经执行了 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

冷静下来分析一下,既然提示的是 SQL 错误,我们不妨在 sequel pro 中手工执行一下这条 SQL 语句。

laravel migrate初学常见错误的解决方法

果然,执行返回错误。

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

laravel migrate初学常见错误的解决方法

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

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

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

laravel migrate初学常见错误的解决方法

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
通过对php一些服务器端特性的配置加强php的安全
Oct 09 PHP
php中文本数据翻页(留言本翻页)
Oct 09 PHP
基于PHP编程注意事项的小结
Apr 27 PHP
php实现mysql封装类示例
May 07 PHP
PHP导入导出Excel代码
Jul 07 PHP
Yii视图操作之自定义分页实现方法
Jul 14 PHP
PHP全功能无变形图片裁剪操作类与用法示例
Jan 10 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
Laravel学习教程之request validation的编写
Oct 25 PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
May 29 PHP
php二维数组按某个键值排序的实例讲解
Feb 15 PHP
PHP7 整型处理机制修改
Mar 09 PHP
Laravel学习基础之migrate的使用教程
Oct 11 #PHP
ThinkPHP 在阿里云上的nginx.config配置实例详解
Oct 11 #PHP
Laravel中的Blade模板引擎示例详解
Oct 10 #PHP
PHP小白必须要知道的php基础知识(超实用)
Oct 10 #PHP
PHP实现数据库统计时间戳按天分组输出数据的方法
Oct 10 #PHP
PHP使用Redis实现防止大并发下二次写入的方法
Oct 09 #PHP
PHP字典树(Trie树)定义与实现方法示例
Oct 09 #PHP
You might like
PHP编程网上资源导航
2006/10/09 PHP
PHP utf-8编码问题,utf8编码,数据库乱码,页面显示输出乱码
2013/04/08 PHP
神盾加密解密教程(二)PHP 神盾解密
2014/06/08 PHP
使用phpexcel类实现excel导入mysql数据库功能(实例代码)
2016/05/12 PHP
浅谈laravel aliases别名的原理
2019/10/24 PHP
跟着JQuery API学Jquery 之三 筛选
2010/04/09 Javascript
用Javascript实现Sleep暂停功能代码
2010/09/03 Javascript
jQuery+css实现图片滚动效果(附源码)
2013/03/18 Javascript
对jQuery的事件绑定的一些思考(补充)
2013/04/20 Javascript
使用jquery.validate自定义方法实现"手机号码或者固话至少填写一个"的逻辑验证
2014/09/01 Javascript
javascript模块化简单解析
2016/04/07 Javascript
AngularJS使用angular.bootstrap完成模块手动加载的方法分析
2017/01/19 Javascript
Vue上传组件vue Simple Uploader的用法示例
2017/08/25 Javascript
对于js垃圾回收机制的理解
2017/09/14 Javascript
基于javascript 显式转换与隐式转换(详解)
2017/12/15 Javascript
element-ui 本地化使用教程详解
2019/10/28 Javascript
详解Vue的watch中的immediate与watch是什么意思
2019/12/30 Javascript
javascript实现倒计时效果
2020/02/17 Javascript
python选择排序算法的实现代码
2013/11/21 Python
Python聚类算法之凝聚层次聚类实例分析
2015/11/20 Python
Python3模拟curl发送post请求操作示例
2019/05/03 Python
500行Python代码打造刷脸考勤系统
2019/06/03 Python
python3实现带多张图片、附件的邮件发送
2019/08/10 Python
python将print输出的信息保留到日志文件中
2019/09/27 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
HTML5 直播疯狂点赞动画实现代码 附源码
2020/04/14 HTML / CSS
耐克波兰官方网站:Nike波兰
2019/09/03 全球购物
Java中有几种方法可以实现一个线程?用什么关键字修饰同步方法?stop()和suspend()方法为何不推荐使用?
2015/08/04 面试题
红旗方阵解说词
2014/02/12 职场文书
庆六一宣传标语
2014/10/08 职场文书
中秋节晚会开场白
2015/05/29 职场文书
力克胡哲观后感
2015/06/10 职场文书
交流会主持词
2015/07/02 职场文书
基于python实现银行管理系统
2021/04/20 Python
mysql定时自动备份数据库的方法步骤
2021/07/07 MySQL
如何利用 CSS Overview 面板重构优化你的网站
2021/10/24 HTML / CSS