Yii2:如何修改模块迁移创建的表?

Yii2: How to modify tables created by module migrations?

假设我们添加了一个带有一堆迁移的第 3 方模块,其中一个迁移创建了 post table。如果我们要修改这个table呢?我们可能想添加另一列,或添加一个外键并将其 link 添加到我们项目的现有 table 之一。如果顺序是根据模块附带的迁移名称(按时间戳)固定的,我们如何确保所有迁移始终以正确的顺序发生?

创建一个扩展原始模块的模块(或使用您需要的代码创建一个复制模块)

在你的模块中

namespace app\modules\yourVendorName ;

class Module extends \vendor\originalvendorname\modelname
{
    public function init()
    {
        parent::init();

        $this->params['foo'] = 'bar';
        // ...  other initialization code ...
    }
}

在app/config

  <?php
  return [
      'components' => [
           'your_module_name' => [
              // list of  component  element configurations
          ],
      ],
      'params' => [
          // list of parameters
      ],
  ];

您可以根据需要轻松更改或添加迁移

好的,这是我的解决方案。我们以通用 "forum" 模块为例。

要应用 "forum" 模块迁移,我们可以做以下两件事之一:

  1. 运行./yii migrate --migrationPath=@app/modules/forum/migrations。这将简单地应用该文件夹中的迁移。它不会复制,也不会重命名它们。这意味着即使 运行ning migrate/redo 也会失败,因为 yii 会期望迁移在主项目的迁移路径中。

  2. 为了解决上述问题,Yii2 开发人员实施了 migration namespaces。我们可以做的是将模块的迁移命名空间添加到我们的应用程序配置中,然后 运行 ./yii migrate。这更好,但仍然有缺陷。我们仍然无法修改模块的迁移,因为我们无法控制决定执行顺序的名称!


如果我们想修改迁移,以上都行不通。您可以执行以下操作:

在您的项目中创建一个新的空迁移,但不要从 yii\db\Migration 扩展。相反,从模块 中定义的迁移中扩展它。对模块中包含的每个迁移文件执行此操作。这样你就可以完全控制执行顺序(你可以给它们起任何你喜欢的名字),你甚至可以通过覆盖它们的 up()/down() 方法来修改这些迁移。

欢迎更好的想法/改进!