Yii2 软删除

Posted 飞凡123

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Yii2 软删除相关的知识,希望对你有一定的参考价值。

什么是软删除

后台操作,删除一条记录,不希望真正的从数据库中删除,用个字段标记一下。比如delete_at。默认0。当执行删除操作,更新delete_at为当前时间戳

这样列表显示的时候只查询delete_at为0的记录。

 

牵涉到Yii2的中的操作

引入SoftDeleteBehavior文件

<?php

namespace common\behavior;

use yii\base\Behavior;
use yii\base\Event;
use yii\db\ActiveRecord;

class SoftDeleteBehavior extends Behavior
{
    /**
     * @var string delete time attribute
     */
    public $timeAttribute = false;
    /**
     *  @var string status attribute
     */
    public $statusAttribute = "is_deleted";
    /**
     *  @var string deleted status attribute
     */
    public $deletedValue = 1;

    /**
     *  @var string active status attribute
     */
    public $activeValue = 0;

    /**
     * @inheritdoc
     */
    public function events() {
        return [
            ActiveRecord::EVENT_BEFORE_DELETE => ‘softDelete‘,
        ];
    }
    /**
     * Set the attribute deleted
     *
     * @param Event $event
     */
    public function softDelete($event) {
        $attributes[1] = $this->statusAttribute;
        $_attribute = $attributes[1];
        if($this->timeAttribute) {
            $this->owner->$_attribute = time();
        } else {
            $this->owner->$attributes[1] = $this->deletedValue;
        }
        // save record
        $this->owner->save(false, $attributes);
        //prevent real delete
        $event->isValid = false;
    }
    /**
     * Restore soft-deleted record
     */
    public function restore() {
        $attributes[1] = $this->statusAttribute;
        $this->owner->$attributes[1] = $this->activeValue;
        // save record
        $this->owner->save(false, $attributes);
    }
    /**
     * Force delete from database
     */
    public function forceDelete() {
        // store model so that we can detach the behavior and delete as normal
        $model = $this->owner;
        $this->detach();
        $model->delete();
    }
}

在需要使用的Model中

use common\behavior\SoftDeleteBehavior;
// ... 
   public function behaviors() {
        return [
            ‘softDelete‘ => [‘class‘ => SoftDeleteBehavior::className(),
                ‘timeAttribute‘ => true,
                ‘statusAttribute‘ => ‘deletedAt‘,
            ],
        ];
    }

Controler中不用改

    public function actionDelete($id)
    {
        $this->findModel($id)->delete();

        return $this->redirect([‘index‘]);
    }

如果真正删除,就是硬删除。

执行 $this->findModel($id)->forceDelete();

以上是关于Yii2 软删除的主要内容,如果未能解决你的问题,请参考以下文章

Yii2片段缓存详解

Yii2-设置和获取删除Cookies空值分析(有代码)

如何使用yii2的缓存依赖特性

软输入键盘隐藏编辑文本

在片段替换上显示/隐藏 Android 软键盘

为啥Android不会暂停视图完全被软键盘挡住的片段?