Laravel 10 和 Laravel 11 的数据库迁移回滚机制完全一致,均仅支持按 batch 回滚,不支持按文件、路径或类名回滚,--step=N 表示回退 N 个批次而非 N 个文件,所有相关命令及风险行为在两版本中无差异。

Laravel 10 和 Laravel 11 在数据库迁移回滚机制上**完全一致**,没有新增或修改任何原生命令语法、参数行为或底层逻辑。所谓“Laravel 11 支持按文件回滚”“--path 参数可用”等说法,均属误解或混淆了第三方包、社区脚本或错误文档——官方从未在 v10 或 v11 中引入按迁移文件路径、时间戳或类名回滚的功能。
批量回滚(即按 batch 回滚)写法完全相同
两者都只支持以 batch 为单位的回滚,这是由 migrations 表结构和迁移执行机制决定的,与版本无关:
-
php artisan migrate:rollback:回滚最近一个 batch(即最后一次php artisan migrate执行的所有迁移) -
php artisan migrate:rollback --step=3:倒序撤销最近 3 个 batch(例如 batch=5、4、3),每个 batch 内所有迁移文件一并执行down() - 不支持
--batch=3或--id=123等直接指定 batch 值的参数,v10 和 v11 均未实现
指定步骤回滚(--step=N)的行为无差异
--step 的语义在两个版本中严格一致:
- 它不是“回退 N 个迁移文件”,而是“回退 N 个 migration 批次”
- 若某次
migrate运行了 6 个新迁移,它们共享同一个 batch 值,则--step=1会一次性执行这 6 个文件的down() - 只要其中任意一个
down()报错(如外键约束、表不存在),整个 step 就中断,后续 batch 不再处理 - 执行前建议运行
SELECT MAX(batch) FROM migrations;查看当前最高批次,避免误判步数
所谓“指定迁移文件回滚”仍是手动操作
无论是 Laravel 10 还是 11,都没有 --path=xxx 或 --name=CreateUsersTable 这类原生命令。网上提到的类似写法:
- 要么来自过时/错误的教程(如把自定义命令或第三方包当成本体)
- 要么是手动干预
migrations表的变通方案:临时修改目标记录的batch值为极大数(如 999),再用--step=1触发回滚,完成后立即还原 - 该操作风险高,易导致迁移状态混乱,且在两个版本中风险完全一致
refresh / fresh / reset 命令也未变化
这些命令在 v10 和 v11 中行为完全相同,仍不适用于“部分回滚”场景:
-
migrate:reset:逐 batch 从大到小执行全部已注册迁移的down(),清空历史 -
migrate:refresh:先reset再migrate,全量重建 -
migrate:fresh:跳过down(),直接调用listTables()批量删表,不校验依赖 - 三者在生产环境均应禁用
--force,因它仅跳过提示,不验证down()安全性


















