对于正确的迁移回滚(通过错误或手动操作),是否需要在迁移中实现特定的事情来确保可以完成?
例如,如果我只有change()
,它有更新,它如何知道如何进行回滚?我是否应该实现up()
和down()
以保持一致性并确保回滚功能的完成?
编辑# 1
我认为我应该在之前的提交中说明以下内容。我的change()
迁移代码如下:
public function change()
{
//rename values
$this->query("update table_name_here set name_en='new value en' name_fr='new value fr' where id = 7");
...
}
这在这里的文档中提到:
Phinx 0.2.0引入了一个称为可逆迁移的新特性。这个特性现在已经成为默认的迁移方法。对于可逆迁移,您只需要定义向上的逻辑,Phinx就可以为您计算出如何自动向下迁移。例如:
[…]
通过Phinx中的Table API完成以下操作是可逆的,并且会自动反转:
- 创建表
- 重命名表
- 添加列
- 重命名列
- 添加索引
- 添加外键
[…]
如果一个命令不能被逆转,那么Phinx将在向下迁移时抛出一个IrreversibleMigrationException。如果您希望使用一个不能在更改函数中反转的命令,您可以使用If语句和$this->isMigratingUp()来只在向上或向下运行。
https://book.cakephp.org/phinx/0/en/migrations.html the-change-method
因此,如果您的迁移只使用change()
方法中可逆的操作,那么您不需要做任何其他操作,Phinx可以自己找出所需的反向命令。
然而,如果你使用的动作不是自动可逆的,要么因为他们没有覆盖,或者因为你没有使用Phinx的表API,但说,例如自定义原始SQL,那么你必须确保自己实现UP/DOWN逻辑,要么使用up()/down()
方法而不是change()
方法(你不能同时使用),或者通过检查$this->isMigratingUp()
在change()
方法中有条件地运行UP或DOWN逻辑。