如何一次运行 Laravel artisan 迁移?

Posted

技术标签:

【中文标题】如何一次运行 Laravel artisan 迁移?【英文标题】:How to run Laravel's artisan migrate one step at a time? 【发布时间】:2015-08-28 22:26:13 【问题描述】:

我已经阅读了Running one specific laravel 4 migration (single file),但这并没有给我答案。

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

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

问题在于,在数据库“从迁移中选择 *”中,它们出现在一个批次中,而不是单独的批次中。这意味着如果我只想回滚一步,我们将回到第 7 步而不是第 9 步——这是我想要的。

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

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

有人知道这个问题的答案吗?

【问题讨论】:

这里有一些信息:***.com/questions/19102197/… 简短的版本是迁移不是为此目的而构建的。 这与我的问题中的链接完全相同。 我很抱歉。我读得太笨拙了。 【参考方案1】:

在 laravel 5.4 中,您可以: php artisan 迁移 --step

当您执行这样的命令时,您可以使用默认的“php artisan migrate:rollback”单独回滚每个迁移,而无需指定回滚的步骤。

【讨论】:

这在某种程度上很有帮助,但我怀疑它是否真的回答了这个问题。运行该命令会迁移所有迁移,但一次迁移一个而不是批量迁移。但问题似乎是在问如何只运行一个迁移文件并停在那里(不迁移其他文件)【参考方案2】:

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

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

这会将 batch 列更改为 1、2、3、4 .. 等。在此处添加 WHERE batch>=... 条件(并更新 @a 的初始值)仅影响某些迁移。

那么您可以根据需要artisan migrate:rollback

【讨论】:

太麻烦了,因为将一个又一个文件复制到文件夹中会更快,我用这个。 好吧,这有多麻烦……那是你的决定。运行两个 SQL 命令似乎比手动复制文件更快。无论如何,我会谦虚地建议,就实际解决问题而言,SQL 是一种“更好”的方式(当然不值得反对)。 不是我的反对意见。我更想知道是否有命令选项。不用担心,问题已经得到解答。 @Arda:是的。我想我做了最初的公关,将--step 添加到核心。 :) @Colin 啊,太好了,不知道,谢谢!这将是一个救生员!【参考方案3】:

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

php artisan migrate:rollback --step=1

【讨论】:

【参考方案4】:

问题在于,在数据库“从迁移中选择 *”中,它们出现在一个批次中,而不是单独的批次中。这意味着如果我只想回滚一步,我们将回到第 7 步而不是第 9 步——这是我想要的。

这不是非常理想,但是在运行它们之后,您可以将数据库表中每个迁移的 batch 值调整为单独的数字。 php artisan migrate:rollback 采用 MAX() 批处理值并将其所有迁移回滚。

【讨论】:

以上是关于如何一次运行 Laravel artisan 迁移?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 laravel 中使用“php artisan migrate”迁移我的数据库

artisan migrate 命令不迁移,不产生输出

Laravel 的 Artisan 没有说要迁移

Laravel Artisan 迁移 [BadMethodCallException]

无法 php artisan 迁移 - Laravel

Laravel artisan 迁移多个数据库