【问题标题】:Laravel exclude table from droppingLaravel 从删除中排除表
【发布时间】:2021-10-11 14:50:44
【问题描述】:

我有一个包含数百万行的大表。我想知道如何才能排除此表被php artisan migrate:fresh 删除。

如果您能帮助我,我将不胜感激!

【问题讨论】:

标签: laravel migration


【解决方案1】:

当你要求 Laravel 创建一个新的迁移时,它创建的文件有两种方法:

public function up()

这是迁移运行时执行的操作,并且

public function down()

这是在迁移回滚时执行的操作(使用回滚命令或刷新命令)。

默认情况下,创建文件时 down() 方法包含的所有内容都是删除表的步骤:

public function down()
{
    Schema::dropIfExists('table_name_here');
}

所以理论上,如果您愿意,可以通过从迁移中删除该行来防止您的表被删除。

但问题是,使用“刷新”命令意味着它将回滚所有迁移,然后再次运行迁移 - 此时,如果您仍然拥有 up() 函数,迁移将跌倒是因为它试图创建一个已经存在的表(因为它还没有被删除)。

所以,我认为你的选择是双重的:

  1. 从迁移中完全删除该表(并在数据库的迁移表中删除对它的任何引用)以防止它受到围绕它进行的迁移的影响。

  2. 如果它必须通过迁移来处理(也许它有指向/从它指向其他表的键),那么我会将表的内容导出为原始 SQL 转储,将其保存在系统上的文件中,然后然后保留迁移 - 迁移过程仍然会创建/销毁它,但使用“--seed”选项在迁移运行后将所有数据放回其中。

【讨论】:

  • 不幸的是,删除迁移文件没有帮助,表仍在下降。并且导出和导入行需要一段时间。
  • 如果您删除了该特定表的迁移文件,除非该表是通过另一次迁移删除的,否则我很难理解如何删除该表?
  • Laravel 在 migrate:fresh 中调用 dropAllTables() 并且此函数不会检查是否存在迁移。
  • 然后考虑使用 migrate:refresh 命令而不是 migrate:fresh?
猜你喜欢
  • 1970-01-01
  • 2018-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-08
  • 2018-01-10
  • 2019-11-09
  • 2021-10-13
相关资源
最近更新 更多