notch / deleted-models
自动将删除的记录复制到单独的表中
Requires
- php: ^8.1|^8.2|^8.3
- illuminate/contracts: ^10.0|^11.0
- spatie/laravel-package-tools: ^1.14.0
This package is not auto-updated.
Last update: 2024-09-24 04:45:33 UTC
README
当删除 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\RestoringDeletedModelEvent
和 Spatie\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)"; })
使用模型上的方法
如果您需要在恢复模型之前和之后运行某些逻辑,您可以在您的模型上实现 beforeRestoringModel
和 afterRestoringModel
。
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
变更日志
有关最近更改的更多信息,请参阅 变更日志。
贡献
有关详细信息,请参阅 贡献指南。
安全漏洞
请审查我们的 安全策略 以了解如何报告安全漏洞。
鸣谢
本软件包受到了这两篇博客文章的启发
- 简单,替代软删除
- 这篇(Soft Deletion Probably Isn't Worth It)。
许可证
MIT 许可证(MIT)。有关更多信息,请参阅 许可证文件。