可以在yii2中恢复已删除的activeRecord实例吗?

时间:2019-09-27 05:19:22

标签: php activerecord yii2

我对yii2 ActiveRecord模型有一个一般性问题。
删除ActiveRecord模型的实例后,我可以恢复它吗?

2 个答案:

答案 0 :(得分:2)

答案取决于。

我不知道您需要什么,但是通常您无法从数据库中恢复已删除的行。您可以做的就是@YasinPatel的建议-添加新列is_deleted,并且可以将Model::delete()设置为is_deleted而不是true。然后,在其他逻辑中,不要使用is_deleted == true处理行。在这种情况下,这些行并没有真正删除,但是可以这样显示。同样,我不知道您的确切情况。

在极少数情况下,您想要删除某些内容(例如调用某些事件或某些内容),可以执行的操作是在事务中运行删除操作,然后将其还原。您可能并不需要这个并且不需要它,但是我相信知道它的存在是很高兴的。

答案 1 :(得分:0)

要视情况而定。

如果记录已被$model->delete()之类的东西删除,而您仍然拥有实例$model,那么您可以执行$model->save()来还原它,因为即使删除了$ model实例删除前仍然具有属性值。

如果您已经丢失了$model的实例,或者如果您从未将其放在首位(例如,由于删除是使用Model::deleteAll($condition)之类的方法完成的,则无法恢复它)使用这种方法。

这也不会恢复任何可能被ON DELETE CASCADE删除的相关记录。

如果您需要恢复与删除记录的请求不同的请求中的记录。您可以将$model存储在会话中,然后从那里获取它并执行$model->save() 例如这样的

public function actionDelete()
{
    $model = Author::findOne(2);
    $model->delete();

    Yii::$app->session->set('model', $model);
}

public function actionRestore()
{
    if (Yii::$app->session->has('model')) {
        $model = Yii::$app->session->get('model');
        $model->save();
    }
}