spatie / laravel-deleted-models
自动将删除的记录复制到单独的表中
Requires
- php: ^8.2
- illuminate/contracts: ^10|^11.0
- spatie/laravel-package-tools: ^1.13.0
Requires (Dev)
- nunomaduro/collision: ^7.0|^8.0
- orchestra/testbench: ^8.0|^9.0
- pestphp/pest: ^2.34
- pestphp/pest-plugin-laravel: ^2.3
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- phpunit/phpunit: ^10.5
- spatie/laravel-ray: ^1.26
- spatie/pest-plugin-test-time: ^2.1
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
。
$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
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 了解详细信息。
安全漏洞
请参阅我们的安全策略 了解如何报告安全漏洞。
鸣谢
本软件包灵感来源于以下两篇博客文章
- 简单、替代的软删除
- [这篇文章](Soft Deletion Probably Isn't Worth It)。
许可证
MIT 许可证 (MIT)。有关更多信息,请参阅许可证文件。