【问题标题】:Can a deleted activeRecord instance be recovered in yii2?yii2中可以恢复被删除的activeRecord实例吗?
【发布时间】:2019-09-27 05:19:22
【问题描述】:

我有一个关于 yii2 ActiveRecord 模型的一般性问题。
当 ActiveRecord 模型的一个实例被删除时,我可以恢复它吗?

【问题讨论】:

  • 不,你不能恢复它,但是你可以像 is_deleted 这样的用户标记而不是硬删除
  • 您实际上并没有删除它,而是标记如果您需要在您需要恢复的应用程序中实现这样的场景

标签: php activerecord yii2


【解决方案1】:

答案取决于。

我不知道您需要什么,但通常您无法从数据库中恢复已删除的行。你可以做的是@YasinPatel 推荐的——添加一个新列is_deleted,而不是Model::delete(),你可以将is_deleted 设置为true。然后在其他逻辑中不处理带有is_deleted == true 的行。在这种情况下,这些行并没有真正被删除,但它们可以这样显示。再说一次,我不知道你的具体情况。

在极少数情况下,您想删除某些内容,可能是调用某些事件或某些内容,您可以做的是在事务中运行删除,然后恢复它。您可能没有要求并且不需要它,但我相信知道它的存在是件好事。

【讨论】:

    【解决方案2】:

    视情况而定。

    如果记录已被$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();
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-17
      • 2020-01-04
      • 2011-11-25
      • 2016-04-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多