本文目录导读:

在 Laravel 中,回滚(rollback)通常不使用标签(tag)来控制。
Laravel 的迁移回滚机制基于批次数(batch number)和文件时间戳,而不是标签。
回滚的核心概念
- 每次执行
php artisan migrate,Laravel 会在migrations表中记录一个递增的 batch 编号。 - 回滚默认回滚 最近一批(batch)的迁移(即最后一个 batch 的所有迁移)。
- 回滚时不涉及标签。
常见回滚命令
# 回滚最近一批迁移 php artisan migrate:rollback # 回滚多批(例如回滚最近 3 批) php artisan migrate:rollback --step=3 # 回滚所有迁移(重置数据库) php artisan migrate:reset # 完全回滚重新迁移 php artisan migrate:refresh
标签(Tag)是用于“迁移分组”,不是“回滚”
从 Laravel 8.x 开始,可以在迁移命令中添加 --tag 选项,用于只执行特定标签的迁移:
# 仅执行标记为 "user-updates" 的迁移 php artisan migrate --tag=user-updates
但回滚不支持 --tag。
如果对某个标签的迁移执行 migrate:rollback,它会回滚整个批次,而不是只回滚该标签下的迁移。
如果你想“只回滚某些迁移”怎么办?
Laravel 没有原生支持按标签回滚,但可以通过以下方式实现:
使用 --path 限定目录
php artisan migrate:rollback --path=/database/migrations/特定文件夹
手动指定回滚(谨慎操作)
用 migrate:reset 重置所有迁移,然后指定 --tag 重新跑需要的迁移(不推荐生产环境)。
创建自定义命令
通过 DB::table('migrations') 获取记录,手动删除对应迁移记录并回滚文件。
总结对比
| 操作 | 支持 --tag |
说明 |
|---|---|---|
migrate(执行) |
✅ 支持 | 只执行指定标签的迁移 |
migrate:rollback(回滚) |
❌ 不支持 | 回滚整个批次 |
migrate:reset(重置) |
❌ 不支持 | 删除所有迁移记录并回滚 |
migrate:refresh(刷新) |
❌ 只支持 --path |
重置后重新执行(可配合 --seed) |
Laravel 使用批次+时间戳管理回滚,而标签只用于执行迁移时的筛选,不能用于回滚方向的控制。