如果你用了 Homestead 并且升级到 macOS High Sierra,你可能需要点进来

Update:

系统更新到 10.13.2 之后发现此 bug 已被修复。

====================

昨晚我尝试在一个本地项目里执行 php artisan migrate:fresh,结果提示

Base table or view not found: 1146 Table 'orders' doesn't exist (SQL: alter table orders add refund_no varchar(255) null after ship_status)

我确认 migrations 目录下有 create_orders_table 这个文件,并且给 orders 添加字段的 migration 文件的生成时间是晚于 create_orders_table 文件的,检查数据库也发现并没有创建 orders 表,查看 migrations 表里面也没有 create_orders_table 对应的记录,也就是说 Laravel 跳过了这个文件。

于是先把数据库清空,找到 migrate 命令对应的类 Illuminate\Database\Console\Migrations\MigrateCommand,核心逻辑是

$this->migrator->run($this->getMigrationPaths(), [
      'pretend' => $this->option('pretend'),
      'step' => $this->option('step'),
]);

Illuminate\Database\Migrations\Migrator 类中找到 run 方法的代码

public function run($paths = [], array $options = [])
{
    //  其他代码略
    $files = $this->getMigrationFiles($paths);
        //  其他代码略
}

$files = $this->getMigrationFiles($paths); 下面加一行 dump($files);,再次执行 migrate,发现 dump 出来的结果依然没有 create_orders_table。看了一眼 getMigrationFiles 的实现,是通过 glob 函数来获取的,说明从底层返回上来的结果里就没有 create_orders_table 文件,这就很诡异了。

我分别在我的 mac 和虚拟机中的 migrations 目录下执行 ls 命令,发现虚拟机 ls 出来的结果就是没有 create_orders_table 文件,看来这个锅和 Laravel 无关,用相关关键字搜索了一下,发现也有人遇到类似的问题 https://github.com/hashicorp/vagrant/issue... ,基本上断定是升级成 AFS 文件系统导致的,目前苹果官方还没有修复这个问题。

在茫茫多的讨论中,看到了 这个这个 回复,于是尝试修改 Homestead.yml

folders:
    - map: ~/vagrant/homestead
      to: /home/vagrant/code
      type: "nfs"
      options:
            mount_options: [ 'nolock', 'vers=3', 'tcp', 'fsc', 'rw', 'noatime' ]

挂载 nfs 的时候加上 tcp 选项,然后在 mac 执行 vagrant reload --provision,启动完成之后发现问题修复。

本作品采用《CC 协议》,转载必须注明作者和本文链接
本帖由 Summer 于 6年前 加精
leo
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 6
阿麦

哇 你这动手分析能力有点强

6年前 评论
Artisan

非常强

6年前 评论
godruoyi

好想我也遇到这个错啊,可为什么我是 windows :sob:

6年前 评论
frowhy

早就升级到 high sierra 了,并没有遇到过这个问题。。。

6年前 评论
leo

@frowhy 我试了好几个项目,并不是百分百复现,而且出现这种情况只是通过 ls 看不到,直接通过路径去读取还是正常的,所以不影响 Web 端的使用。

6年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!