spatie/laravel-deleted-models

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

1.0.5 2024-05-03 08:01 UTC

This package is auto-updated.

Last update: 2024-09-08 19:28:18 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

$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 trait

您可以在 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

变更日志

请参阅CHANGELOG 了解最近更改的更多信息。

贡献

请参阅CONTRIBUTING 了解详细信息。

安全漏洞

请参阅我们的安全策略 了解如何报告安全漏洞。

鸣谢

本软件包灵感来源于以下两篇博客文章

许可证

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