notch/deleted-models

自动将删除的记录复制到单独的表中

1.0 2024-04-08 04:01 UTC

This package is not auto-updated.

Last update: 2024-09-24 04:45:33 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

当删除 Eloquent 模型时,此包会将该模型的属性复制到名为 deleted_models 的新表中。您可以将其视为一种“模型回收站”。

$blogPost = BlogPost::find(5); // an Eloquent model

$blogPost->delete(); // values will be copied to the `deleted_models` table.

要恢复之前的模型,可以调用 restore 并传入 id。

$blogPost = BlogPost::restore(5); // $blogPost will be restored and returned

这种在删除时保留信息的方式可以视为软删除的替代方案。您可以在这篇博客文章中了解更多关于权衡的内容。

支持我们

我们在创建 最佳开源软件包 上投入了大量资源。您可以通过 购买我们的付费产品之一 来支持我们。

我们非常感谢您从家乡寄来明信片,说明您正在使用我们的哪个软件包。您可以在 我们的联系页面 上找到我们的地址。我们将在 我们的虚拟明信片墙 上发布所有收到的明信片。

安装

您可以通过 composer 安装此软件包。

composer require spatie/laravel-deleted-models

要创建 deleted_models 表,您可以使用以下命令发布和运行迁移:

php artisan vendor:publish --tag="deleted-models-migrations"
php artisan migrate

可选地,您可以使用以下命令发布配置文件:

php artisan vendor:publish --tag="deleted-models-config"

这是发布配置文件的内容

return [
    /*
     * The model uses to store deleted models.
     */
    'model' => Spatie\DeletedModels\Models\DeletedModel::class,

    /*
     * After this amount of days, the records in `deleted_models` will be deleted
     *
     * This functionality uses Laravel's native pruning feature.
     */
    'prune_after_days' => 365,
];

deleted_models 表的修剪依赖于 Laravel 的原生修剪功能。不要忘记按照 Laravel 文档中的说明安排 model:prune (Laravel 文档)

$schedule->command('model:prune', [
    '--model' => [\Spatie\DeletedModels\Models\DeletedModel::class],
])->daily();

用法

您应该将 KeepsDeletedModels 特性添加到所有在其删除时属性应该写入 deleted_models 的模型。

use Illuminate\Database\Eloquent\Model;
use Spatie\DeletedModels\Models\Concerns\KeepsDeletedModels;

class BlogPost extends Model
{
    use KeepsDeletedModels;
}

有了这个,当模型被删除时,属性将被写入 deleted_models

$blogPost = BlogPost::find(5);

$blogPost->delete(); // values will be copied to the `deleted_models` table.

要恢复之前的模型,可以调用 restore 并传入 id。

$blogPost = BlogPost::restore(5); // $blogPost will be restored and returned

如果要恢复的模型在 deleted_models 表中找不到,将抛出 Spatie\DeletedModels\Exceptions\NoModelFoundToRestore 异常。

不保存的恢复

要恢复到内存中,而不实际保存它,可以调用 makeRestored。请注意,调用此方法也将删除 deleted_models_table 中的记录。

// $blogPost will be return, but it is not saved in the db yet
$blogPost = Blogpost::makeRestored($id); 

$blogPost->save();

如果要恢复的模型在 deleted_models 表中找不到,makeRestored 将返回 null

不触发事件的恢复

默认情况下,当在模型上调用 restore 时,将分发 Spatie\DeletedModels\Events\RestoringDeletedModelEventSpatie\DeletedModels\Events\DeletedModelEvent

如果您不希望分发这些事件,请调用 restoreQuietly

BlogPost::restoreQuietly(); // no events will be dispatched

自定义恢复过程

使用传递给 restore 的闭包

restore 函数接受一个可调用对象作为第二个参数。在内存中创建已恢复的模型,但在将其保存到数据库之前,将执行 beforeSaving 可调用对象。

BlogPost::restore(5, function(BlogPost $post, DeletedModel $deletedModel) {
    $post->title = "{$post->title} (restored)";
})

使用模型上的方法

如果您需要在恢复模型之前和之后运行某些逻辑,您可以在您的模型上实现 beforeRestoringModelafterRestoringModel

use Illuminate\Database\Eloquent\Model;
use Spatie\DeletedModels\Models\Concerns\KeepsDeletedModels;

class BlogPost extends Model
{
    use KeepsDeletedModels;
    
    public static function beforeRestoringModel(DeletedModel $deletedModel): void
    {
        // this will be executed right before restoring a model
    }

    public static function afterRestoringModel(
        Model $restoredMode,
        DeletedModel $deletedModel
    ): void
    {
        // this will be executed right after restoring a model
    }
}

为了确定哪些属性和值应该保留在 deleted_models 中,您可以实现 attributesToKeep

use Illuminate\Database\Eloquent\Model;
use Spatie\DeletedModels\Models\Concerns\KeepsDeletedModels;

class BlogPost extends Model
{
    use KeepsDeletedModels;
    
    public function attributesToKeep(): array
    {
        // here you can customize which values should be kept. This is
        // the default implementation.
        
        return $this->toArray();
    }
}

修剪已删除模型

经过一段时间,deleted_models 表可能会变得很大。DeletedModel 实现了 Laravel 的原生 MassPrunable 特性

您可以在 deleted-models.php 配置文件中的 prune_after_days 键配置 deleted_models 表中的记录将被清理的天数。默认情况下,所有已删除的模型将被保留 365 天。

不要忘记按照 Laravel 文档中的说明 安排 model:prune

删除和恢复过程的低级定制

DeletedModel 模型实现了大部分保留和恢复已删除模型的逻辑。您可以通过创建一个扩展 Spatie\DeletedModels\Models\DeletedModel 的类来修改任何行为。您应该在 deleted-models.php 配置文件中的 model 键中放置您扩展类的名称。

有了这个,您就可以覆盖 DeletedModel 中的任何方法。

use Spatie\DeletedModels\Models\DeletedModel;

class CustomDeletedModel extends DeletedModel
{
    protected function makeRestoredModel(string $modelClass): mixed
    {
        // add custom logic
    
        return parent::makeRestoredModel($modelClass)
    }
}

测试

composer test

变更日志

有关最近更改的更多信息,请参阅 变更日志

贡献

有关详细信息,请参阅 贡献指南

安全漏洞

请审查我们的 安全策略 以了解如何报告安全漏洞。

鸣谢

本软件包受到了这两篇博客文章的启发

许可证

MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件