nex-otaku/yii2-softdelete

ActiveRecord的软删除。

安装: 144

依赖项: 1

建议者: 0

安全: 0

星标: 0

观察者: 1

分支: 0

开放问题: 0

类型:yii2-extension

1.0.0 2017-07-31 15:15 UTC

This package is auto-updated.

Last update: 2024-08-29 03:29:57 UTC


README

在Yii2中对ActiveRecord模型实现SoftDelete。

为什么需要它

SoftDelete(软删除)的原理是:而不是从数据库中永久删除记录,只是更改一个标记(例如,deleted=1)。在从数据库中检索时,我们根据此标记“过滤”所有已删除的记录,并只获取有效记录。

为什么需要它,不是直接永久删除更好吗?

在相对复杂的应用程序中,有统计数据、报告和相关数据。例如,客户在网站上下订单。假设我们删除了一个客户,以及与他相关的所有订单。结果,我们无法准确地知道在一定时期内我们有多少订单以及总金额。在这种情况下,SoftDelete很有帮助。默认情况下,我们忽略标记为已删除的记录,但在需要时可以计算它们并从它们中获取任何信息。

此外,保存已删除的记录在理论上可能有助于调试代码和恢复意外删除的数据。但在实践中,这种情况几乎从未发生过。而且,使用常规备份恢复数据要方便得多。因此,在决定使用SoftDelete之前,权衡利弊。也许在您的项目中它不会带来任何好处,反而会妨碍您。

安装

最好通过Composer安装。

执行

php composer.phar require --prefer-dist nex-otaku/yii2-softdelete "*"

或者将以下内容添加到您的composer.json文件的“require”列表中。

"nex-otaku/yii2-softdelete": "*"

数据库模式。

在表中添加“deleted”字段:TINYINT(1) NOT NULL DEFAULT '1'。为表的所有外部键设置ON DELETE RESTRICT模式。这可以部分防止意外删除记录。

连接扩展。

扩展通过Composer的依赖自动加载。

使用的扩展

  1. SoftDeleteBehavior。 https://github.com/yii2tech/ar-softdelete

  2. QueryScopeBehavior以显示除了删除的记录之外的所有记录。 https://github.com/mdmsoft/yii2-ar-behaviors

  3. NotDeletedTrait、SoftDeleteBehavior(根据“deleted”字段配置)、SoftDeleteTimestampBehavior、SoftDeleteBlameableBehavior。 https://github.com/nex-otaku/yii2-softdelete

QueryScopeBehavior行为会自动连接到ActiveQuery。不需要在别处特别指定。安装了扩展后,它就会自动连接到ActiveQuery。

在模型中连接。

在模型中连接NotDeletedTraitSoftDeleteBehavior。如果需要知道谁何时删除了记录,请连接SoftDeleteTimestampBehaviorSoftDeleteBlameableBehavior。不要忘记在数据库表中添加相应的字段“deleted_by”、“deleted_at”。

由于这些字段由系统自动管理且不可直接由用户编辑,因此请从模型的规则中删除它们。请参阅“rules()”方法。

示例。

class Feed extends \yii\db\ActiveRecord
{
    use \nex_otaku\softdelete\NotDeletedTrait;
    public function behaviors()
    {
        return [
            SoftDeleteBehavior::className(),
            SoftDeleteTimestampBehavior::className(),
            SoftDeleteBlameableBehavior::className(),
        ];
    }
}

使用

// Удаление.
$model->safeDelete();

// Выборка записей, которые не были удалены.
$coolModels = CoolModel::find()->notDeleted()->all();

级联删除由自己实现。