laravel 11回滚机制仍基于down()方法,支持按批次回滚(默认最新一批)、--step指定批次数、migrate:reset清空全部、migrate:refresh重置并重迁;需确保down()可逆,生产禁用reset/refresh,严禁修改已提交迁移文件。

Laravel 11 的数据库迁移回滚机制与之前版本保持一致,核心逻辑未变,但需注意其默认依赖 doctrine/dbal(已预装)和更严格的 schema 检查。回滚不是“撤销 SQL”,而是执行迁移文件中定义的 down() 方法,因此能否安全回滚,取决于你是否正确编写了可逆逻辑。
基础回滚:撤回最近一次迁移批次
每次运行 php artisan migrate,Laravel 会把该次执行的所有迁移归为一个“批次(batch)”。migrate:rollback 默认只撤回最新这个批次:
-
php artisan migrate:rollback—— 执行最新一批迁移的down()方法 - 若该批次含 3 个迁移文件(如新增 users 表、添加 email 字段、创建索引),它们会**同时被回滚**
- 成功后,
migrations表中对应记录被删除,数据库结构恢复到该批次执行前的状态
定向回滚:控制回滚多少个批次
用 --step 参数指定要撤回的批次数量,适合逐步排查问题:
-
php artisan migrate:rollback --step=2—— 回滚最近两个批次(即倒数第 1 批 + 倒数第 2 批) -
--step=1等价于不加参数,是默认行为 - 注意:
step计的是“批次”数,不是迁移文件个数;一个批次可能包含多个文件
彻底清空:重置全部迁移
当本地开发需要从零重建数据库时,这两个命令更常用:
-
php artisan migrate:reset—— 逐个执行所有已应用迁移的down(),清空migrations表 -
php artisan migrate:refresh—— 先reset,再migrate,等效于“删光重来” - 搭配测试数据:加
--seed可在刷新后自动运行 seeder,例如php artisan migrate:refresh --seed
关键注意事项(Laravel 11 特别提醒)
新版对安全性与可维护性要求更高,以下几点容易踩坑:
-
down() 必须真实可逆:比如
dropTable('users')安全,但dropColumn('users', 'email')若表中已有大量数据,可能锁表或失败;建议改用新迁移“标记弃用”,而非直接删字段 -
生产环境禁用 reset/refresh:这些命令会清空结构甚至数据,Laravel 11 默认在生产环境下禁止执行,除非显式加
--force -
查看状态再操作:运行
php artisan migrate:status可确认哪些迁移已执行、属于哪个 batch,避免误判 -
不要修改已提交的迁移文件:Laravel 11 会校验迁移类名与文件名严格匹配(大小写、下划线、复数),改名或改内容会导致
Class not found











