“nothing to migrate”表示migrations表中无未执行记录,原因包括文件路径错误、命名不规范、未清理历史记录或环境配置错连数据库,需按迁移状态、文件路径、环境变量顺序排查。

“Nothing to migrate”不是命令失效,而是 Laravel 明确告诉你:当前 migrations 表里没有未执行的迁移记录——哪怕你刚加了新文件,它也不会跑。
为什么新迁移文件被完全忽略
根本原因不是文件没写对,而是 Laravel 的执行判断只依赖 migrations 表,不校验物理表是否存在、也不扫描文件内容。它只看这条记录有没有:2024_05_10_123456_create_posts_table.php 是否已在 migrations 表的 migration 字段中。
- 文件放错目录(比如丢进
app/或database/根下)→ Laravel 根本不扫描 - 命名含短横线(
-)、中文、空格或多余下划线 → 文件被跳过,且无提示 - 手动删过表但没清理
migrations表 → Laravel 认为“已执行”,直接跳过 - 用
php artisan make:migration生成后又重命名了时间戳 → 时间顺序错乱,可能被排到最后甚至漏执行
快速确认迁移状态的三步检查法
别猜,直接查数据库和命令输出:
- 运行
php artisan migrate:status,看新文件是否出现在列表里、Ran?列是否为No - 连上数据库,执行
SELECT * FROM migrations WHERE migration LIKE '%create_posts%';,确认记录确实不存在 - 检查文件路径是否为
database/migrations/2024_05_10_123456_create_posts_table.php(注意:不能带database/migrations/前缀传给--path)
php artisan migrate --path 的坑与正确用法
这个参数不是“指定文件路径”,而是“从 database/migrations/ 开始的相对子路径”。写错就静默失败,毫无报错。
- ✅ 正确:
php artisan migrate --path=2024_05_10_123456_create_posts_table.php - ❌ 错误:
php artisan migrate --path=database/migrations/2024_05_10_123456_create_posts_table.php(会拼成 double path) - ⚠️ 注意:
--path指定的文件,其up()方法仍要能独立执行——不能依赖其他未跑的迁移里的表或字段 - 如果只是想补跑一个漏掉的迁移,且它在
migrations表里真没记录,--path是最安全的方式
最容易被忽略的环境配置点
迁移安静地在错库上执行一遍,是你本地开发时最常踩的暗坑。
- 检查
.env里的DB_DATABASE和DB_CONNECTION—— 连错库会导致迁移在测试库跑成功,而你在生产库看到 “Nothing to migrate” 却以为没生效 - 确认
config/database.php中对应连接的'database' => env('DB_DATABASE', 'forge')没被硬编码覆盖 - 运行
php artisan tinker后输入DB::connection()->getDatabaseName(),实锤当前连的是哪个库
真正卡住人的,往往不是语法错误,而是 migrations 表状态、文件路径、环境变量这三者之间某一处的微小错位。每次遇到 “Nothing to migrate”,先查表,再查路径,最后盯死 .env —— 不要跳步。











