模型软删除

    目录

    因为种种原因,现在大部分场景下,我们开发删除功能时,都不会将记录物理删除。

    使用模型软删除功能非常简单,只需要在模型类中引入 trait Imi\Model\SoftDelete\Traits\TSoftDelete,并且在类上加上注解 @SoftDelete

    示例

    <?php
    
    namespace Imi\Test\Component\Model;
    
    use Imi\Bean\Annotation\Inherit;
    use Imi\Model\SoftDelete\Annotation\SoftDelete;
    use Imi\Model\SoftDelete\Traits\TSoftDelete;
    use Imi\Test\Component\Model\Base\TestSoftDeleteBase;
    
    /**
     * tb_test_soft_delete.
     *
     * @Inherit
     * @SoftDelete
     */
    class TestSoftDelete extends TestSoftDeleteBase
    {
        use TSoftDelete;
    }

    注解

    @SoftDelete

    软删除

    类名:Imi\Model\SoftDelete\Annotation\SoftDelete

    属性名称说明
    field软删除字段名,默认值见下方说明
    default软删除字段的默认值,代表非删除状态,默认为0

    field 不设置时,默认从配置 @app.model.softDelete.fields.deleteTime 读取,如果没有配置,默认是:delete_time(imi >= v2.0.16)

    使用

    imi 模型软删除,默认逻辑是非删除状态字段值为 0,删除后值为当前时间戳。

    你也可以自行定义字段名、默认值、删除后的值。

    字段名、默认值可以通过 @SoftDelete 进行设置。

    删除后的值可以通过覆盖模型类中的 __generateSoftDeleteValue() 方法实现:

    /**
     * 生成软删除字段的值
     *
     * @return mixed
     */
    public function __generateSoftDeleteValue()
    {
        return time();
    }

    查询

    如果模型引入了软删除机制,使用 XXXModel::find()XXXModel::query() 等方式查询时,自动过滤被软删除的数据。

    如果需要查询到被软删除的数据,请使用 XXXModel::findDeleted()

    如果想要查到所有数据(包括删除和未删除),可以使用 XXXModel::originQuery() 获取查询构建器。

    删除

    软删除:

    XXXModel::find(1)->delete();

    物理删除:

    XXXModel::find(1)->hardDelete();

    恢复记录

    恢复被软删除的记录:

    XXXModel::findDeleted(1)-restore();