如何逐步运行Laravel的artisan migrate命令?

9

我已经阅读了运行特定的laravel 4迁移(单个文件),但这并没有给我答案。

我想知道是否有一种方法可以运行命令,以便它只执行下一个迁移,而且只是这一个迁移。

我的Migrate文件夹中有10个文件。其中7个已经迁移完成。现在我发现,当我创建3个新文件并运行命令时,它们都被执行了。

问题是,在数据库中,“select * from migrations”它们显示为一个批次而不是分开的。这意味着如果我只想回滚一步,我们就回到第7步而不是第9步 - 而我想要的是第9步。

有时这很令人困惑,因为我想逐步回滚一步,而不是回滚一个批次的所有步骤。

我知道我可以将文件移动到另一个文件夹中,只留下一个来运行migrate。然后移动下一个并再次迁移,但这非常不方便 - 如果我不小心在移动和迁移第9步之前移动和迁移第10步会发生什么。

有人知道答案吗?


1
这里有一些信息:https://dev59.com/UWIk5IYBdhLWcg3wn_f1 简而言之,迁移不是为此目的而建立的。 - Joel Hinz
这就是我问题中提到的完全相同的链接。 - hogan
我道歉。我读得太笨拙了。 - Joel Hinz
有时候Laravel框架并没有彻底考虑所有事情。默认行为应该是一次只迁移一个文件。如果您想要迁移更多文件,那么再指定步骤数。Laravel在很多方面都很出色,但有时它会倾向于将数据库视为一个附带思考的东西。 - cartbeforehorse
4个回答

16
在laravel 5.4中,你可以执行以下命令: php artisan migrate --step 使用这个命令后,如果想要回滚每个迁移操作,只需要使用默认的 "php artisan migrate:rollback" 命令即可,无需指定回滚多少步骤。

1
这在某种程度上是有帮助的,但我怀疑它是否真正回答了问题。运行该命令会迁移所有迁移,但是一次只能迁移一个而不是作为批处理。但问题似乎是要求如何仅运行一个迁移文件并停止(将其他文件留待迁移)。 - gthuo

2

我不知道一次性向前迁移的方法。但是您可以像这样逐个撤销迁移:

php artisan migrate:rollback --step=1

0

有点小技巧,但你可以运行artisan migrate来运行所有迁移,然后运行以下SQL命令,使其看起来像是一个一个地运行迁移:

SET @a = 0;  
UPDATE migrations SET batch = @a:=@a+1;

那将会把批处理列改为1、2、3、4等。添加一个WHERE batch>=...条件(并更新@a的初始值),以仅影响某些迁移。然后,您可以根据需要重复执行artisan migrate:rollback

1
太麻烦了,一个一个地复制文件到文件夹里会更快,所以我选择这个方法。 - hogan
好吧,这有多麻烦...那就由你自己决定了。运行两个SQL命令似乎比手动复制文件更快。无论如何,我谦虚地建议使用SQL是“更好”的解决方法,从实际解决问题的角度来看,(并且肯定不应该被点踩)。 - Colin
1
不是我点的踩。我只是想知道是否有一个命令选项。别担心了,问题已经得到解答了。 - hogan
1
@Arda:是的。我想我最初提交了添加“--step”到核心的PR :) - Colin
1
@Colin 啊,太好了,我不知道这个,谢谢啊!这会是一个救命稻草! - Arda
显示剩余2条评论

-1
问题在于在数据库中的“select * from migrations”中,它们显示为一批而不是分开的。这意味着如果我只想回滚一步,我们就回到了第7步而不是第9步 - 这不是我想要的。
虽然不是非常理想,但在运行它们之后,您可以调整数据库表中每个迁移的“batch”值以成为单独的数字。php artisan migrate:rollback获取MAX()批处理值并将其所有迁移回滚。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接