假设我们添加了一个带有一堆迁移的 3rd 方模块,其中一个迁移创建了一个post
表。如果我们想修改这张表怎么办?我们可能想要添加另一列,或者添加一个外键并将其链接到我们项目的现有表之一。如果顺序是基于模块附带的迁移名称(按时间戳)固定的,我们如何确保所有迁移始终以正确的顺序发生?
2 回答
创建一个扩展原始模块的模块(或使用您需要的 coede 创建一个重复的模块)
在你的模块中
namespace app\modules\yourVendorName ;
class Module extends \vendor\originalvendorname\modelname
{
public function init()
{
parent::init();
$this->params['foo'] = 'bar';
// ... other initialization code ...
}
}
在应用程序/配置中
<?php
return [
'components' => [
'your_module_name' => [
// list of component element configurations
],
],
'params' => [
// list of parameters
],
];
您可以根据需要轻松更改或添加迁移
好的,这是我的解决方案。让我们以一个通用的“论坛”模块为例。
要应用“论坛”模块迁移,我们可以做以下两件事之一:
运行
./yii migrate --migrationPath=@app/modules/forum/migrations
。这只会应用该文件夹中的迁移。它不会复制,也不会重命名它们。这意味着即使运行migrate/redo
也会失败,因为 yii 会期望迁移在主项目的迁移路径中。为了解决上述问题,Yii2 开发人员实现了迁移命名空间。我们可以做的是将模块的迁移命名空间添加到我们的应用程序配置中,然后运行
./yii migrate
. 这更好,但仍有缺陷。我们仍然无法修改模块的迁移,因为我们无法控制决定执行顺序的名称!
如果我们想修改迁移,上述方法都不起作用。这是您可以执行的操作:
在您的项目中创建一个新的空迁移,但不要从yii\db\Migration
. 相反,从模块中定义的迁移扩展它。对模块中包含的每个迁移文件执行此操作。这样你就可以完全控制执行顺序(你可以给他们任何你喜欢的名字),你甚至可以通过覆盖他们的up()
/down()
方法来修改这些迁移。
欢迎更好的想法/改进!