如果你用了 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
addrefund_no
varchar(255) null aftership_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 协议》,转载必须注明作者和本文链接
哇 你这动手分析能力有点强
非常强
好想我也遇到这个错啊,可为什么我是
windows
:sob:还是用 docker 吧
早就升级到 high sierra 了,并没有遇到过这个问题。。。
@frowhy 我试了好几个项目,并不是百分百复现,而且出现这种情况只是通过 ls 看不到,直接通过路径去读取还是正常的,所以不影响 Web 端的使用。