假设我有, 和a.php
迁移b.php
类文件。如何回滚到特定的迁移状态,例如使用 artisan 命令定义的状态?c.php
d.php
b.php
9 回答
恐怕,你不能直接这样做。
您可以: 1、Rollback The Last Migration Operation(所有迁移在最后一批中运行)
php artisan migrate:rollback
2、回滚所有迁移
php artisan migrate:reset
3、回滚所有迁移并再次运行它们
php artisan migrate:refresh
php artisan migrate:refresh --seed
在您的情况下,修改 b.php 及其up()
方法,然后执行artisan migrate:refresh
命令。
有一种方法可以通过手动编辑数据库来破解它。在表中,通过给最后一次迁移一个不同的批号来migrations
更改列。batch
请注意,它们是按递增顺序排列的,因此请相应地进行编辑。这会跟踪单独应用了哪些迁移。
然后运行artisan:rollback
,它将撤消最后一个“批处理”。
因此,如果您想将它们全部分开,则从顶部开始并分别给出 1,2,3,4,5 等等...您可以看到它很容易编写脚本,如果您可以制作一个工匠命令希望分离所有迁移。
在我的经验中。我从不迁移:回滚。我通常会创建另一个迁移,它会执行“撤消/回滚”以前的迁移所需的所有更改。
这样,如果您想回滚 2-x 步,您可以灵活,您可以创建一个新的迁移来实现您想要的更改,然后通过 php artisan migrate 运行新的迁移。
事实上,(还)没有这个功能。出奇
最好的办法是创建一个新文件 backtob.php 并使其向上调用您的其他迁移文件。为避免复制和粘贴,您可以执行以下操作:
class BacktoB {
public function up () {
// the database is in the after D state //
$migrateD = new D();
$migrateD->down();
// the database is in the after C state //
$migrateC = new C();
$migrateC->down();
// the database is in the before C state //
// before C = B //
}
public function down () {
// the database is in the B state //
$migrateC = new C();
$migrateC->up();
// the database is in the after C state //
$migrateD = new D();
$migrateD->up();
// the database is in the after D state //
}
}
如您所见,您可以创建 up 和 down 调用这些迁移的 up 和 down 来恢复您想要恢复的内容。
这不是理想,但这是我们可以做的。
如果你真的想要——你可以编写一个自定义函数来查询迁移表,查找你所追求的文件,并计算出回滚的次数——然后执行一个“迁移:回滚”循环,直到你到达需要迁移...
有一个简单但肮脏的方法:
如果您有迁移a.php
,b.php
并且c.php
想要回滚c
and b
,您可以简单地修改a.php
为会出现语法错误...删除分号或其他内容。
因此,当您运行时,php artisan migrate:rollback
它会回滚c
和b
并停止并在a
. 从那时起,回滚c
和b
将被视为最后一次迁移操作。
不要忘记修复您故意在a.php
.
由于 Laravel 仅提供 php artisan migrate:rollback 来回滚您的迁移脚本,因此回滚您选择的迁移脚本的最佳方法是创建一个新的迁移脚本并将脚本放入您的 down 方法(在您选择的迁移脚本上)到新创建的迁移脚本。希望这有帮助。
使用 php artisan migrate:rollback 命令。
php artisan migrate:rollback
要查看回滚会做什么,请使用 --pretend 选项。
php artisan migrate:rollback --pretend
您还可以指定默认连接以外的数据库连接。
php artisan migrate:rollback --pretend --database=other-one