技术控

    今日:0| 主题:63445
收藏本版 (1)
最新软件应用技术尽在掌握

[其他] 初学 laravel migrate 常见错误解决

[复制链接]
南方北方是远方 发表于 2016-9-30 11:08:01
339 2
断断续续开始 laravel 入门学习,想整个简单的通讯录系统,设立了两个表,一个 branches ,一个 contacts。
  在创建 migration 文件的时候,没有考虑仔细,先把 contacts 表建立了,contacts 表有个外键连接到 branches 的 id,结果执行 migrate 命令的时候,出现以下错误:
  1. [Illuminate\Database\QueryException]                                                                                       
  2.   SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `contacts` add constraint `contac  
  3.   ts_branch_id_foreign` foreign key (`branch_id`) references `branches` (`id`) on delete cascade)
  4. [PDOException]                                                         
  5.   SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
复制代码
初步怀疑是表创建先后不规范造成,于是,手动修改 branches 的 migration 文件名称上的日期,再执行
  1. php artisan migrate:reset
复制代码
出现如下错误:
  1. [ErrorException]                                                                                
  2.   include(/Users/Ade/www/laravel_phonebook5.2): failed to open stream: Operation now in progress
复制代码
failed to open stream 错误解决

  光看错误提示不是很理解,我们查看 laravel 的 log 文件
  1. more storage/logs/laravel.log
复制代码
找到出现 ERROR 的那段话:
  1. [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
  2. Stack trace:
  3. #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)
  4. #1 /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php(412): Composer\Autoload\includeFile()
  5. #2 /Users/Ade/www/laravel_phonebook5.2/vendor/composer/ClassLoader.php(301): Composer\Autoload\includeFile('/Users/Ade/www/...')
  6. #3 [internal function]: Composer\Autoload\ClassLoader->loadClass('CreateBranchesT...')
  7. #4 /Users/Ade/www/laravel_phonebook5.2/vendor/laravel/framework/src/Illuminate/Database/Migrations/Migrator.php(335): spl_autoload_call('CreateBranchesT...')
  8. #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...')
  9. #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 常见错误解决

初学 laravel migrate 常见错误解决

   而这个文件,在 log 文件中已经指出,即 resolve('2016_09_12_1728...') 。log 提示的这个名称,就是我修改的 branch 的 migration 文件名称。
  我们再搜搜正常的 migration 文件会在哪些地方出现:
  1. mdfind 2014_10_12_000000_create_users_table.php|grep phonebook
复制代码
  

初学 laravel migrate 常见错误解决

初学 laravel migrate 常见错误解决

  可见,正常的有 3 个地方出现,修改过的只有 1 个地方出现。
  编辑这两个未出现的文件
   调整 autoload_static.php 文件

   发现 vendor/composer/autoload_static.php 文件中,和 branches 相关的语句如下:
  1. 'CreateBranchesTable' => __DIR__ .,
复制代码
想来应该是改名的时候,PHP Storm自动帮我把这个文件里面有关 branches 文件路径全部给删掉了。加回去就好了。
  参照正常的 migration 文件名的配置情况,补充为
  1. 'CreateBranchesTable' => __DIR__ . '/../..' . '/database/migrations/2016_09_12_172822_create_branches_table.php',
复制代码
调整 autoload_classmap.php 文件

  我们发现 autoload_classmap.php 文件中,有关 branches 的路径名还是修改前的路径:
  1. 'CreateBranchesTable' => $baseDir . '/database/migrations/2016_09_29_172822_create_branches_table.php',
复制代码
将其修改为
  1. 'CreateBranchesTable' => $baseDir . '/database/migrations/2016_09_12_172822_create_branches_table.php',
复制代码
再执行 migrate 命令
  1. php artisan migrate:reset
复制代码
  

初学 laravel migrate 常见错误解决

初学 laravel migrate 常见错误解决

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

  通过 sequel pro 连上数据库查看
   

初学 laravel migrate 常见错误解决

初学 laravel migrate 常见错误解决

  发现 contacts 表果然存在,但是 migration 表中已没有内容,想必再执行前面 migrate 命令的时候出现错误,contacts 的执行记录并没有写入 migrations 表中。
  我们可以重新执行 migrate 命令试试看。首先手动删除这两张表,也就是清空数据库,然后执行:
  1. php artisan migrate:reset1
复制代码
我们先忽视创建 contacts 表出现的错误,刷新 sequel pro 查看一下:
   

初学 laravel migrate 常见错误解决

初学 laravel migrate 常见错误解决

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

  现在,我们已经执行了 migrate 命令,我们重新来看看这个最早出现的错误:
  1. php artisan migrate:reset2
复制代码
冷静下来分析一下,既然提示的是 SQL 错误,我们不妨在 sequel pro 中手工执行一下这条 SQL 语句。
   

初学 laravel migrate 常见错误解决

初学 laravel migrate 常见错误解决

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

初学 laravel migrate 常见错误解决

初学 laravel migrate 常见错误解决

  找到问题原因后,我们就清空数据库,修改 contacts 的 migration 文件,调整 branch_id 为:
  1. php artisan migrate:reset3
复制代码
再重新执行 migrate 命令,成功!
   

初学 laravel migrate 常见错误解决

初学 laravel migrate 常见错误解决
时日热天 发表于 2016-9-30 13:24:25
边撸边过
回复 支持 反对

使用道具 举报

annieicy 发表于 2016-9-30 13:56:58
土豪,我们做朋友吧。
回复 支持 反对

使用道具 举报

我要投稿

推荐阅读


回页顶回复上一篇下一篇回列表
手机版/c.CoLaBug.com ( 粤ICP备05003221号 | 粤公网安备 44010402000842号 )

© 2001-2017 Comsenz Inc.

返回顶部 返回列表