nguyenhiepvan / laravel-model-cleanup
此软件包用于删除数据库中不需要的记录。
Requires
- php: ^7.2
- illuminate/support: ^7.21
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- mockery/mockery: ^1.0
- orchestra/testbench: ^5.3
- pestphp/pest: ^0.2.3
- pestphp/pest-plugin-laravel: ^0.2.0
- phpunit/phpunit: ^9.0
- psalm/plugin-laravel: ^1.2
- spatie/test-time: ^1.2
- vimeo/psalm: ^3.11
README
此软件包将清理旧记录。
您希望清理的模型应该有一个返回模型清理配置的cleanUp
方法。以下是一个示例,其中所有5天以上的记录都将被清理。
use Illuminate\Database\Eloquent\Model; use Spatie\ModelCleanup\CleanupConfig; use Spatie\ModelCleanup\GetsCleanedUp; class YourModel extends Model implements GetsCleanedUp { ... public function cleanUp(CleanupConfig $config): void { $config->olderThanDays(5); } }
在配置文件中注册模型后,运行clean:models
artisan命令将删除所有5天前创建的记录。
该软件包包含各种其他方法,用于指定应删除哪些记录。
支持我们
通过观看我们的付费视频课程,了解如何创建此类软件包
我们投入了大量资源来创建最佳开源软件包。您可以通过购买我们的付费产品之一来支持我们。
我们非常感谢您从家乡寄给我们明信片,并提到您正在使用我们的哪个软件包。您可以在我们的联系页面找到我们的地址。我们将在我们的虚拟明信片墙上发布所有收到的明信片。
安装
您可以通过composer安装此软件包
composer require spatie/laravel-model-cleanup
接下来,您必须发布配置文件
php artisan vendor:publish --provider="Spatie\ModelCleanup\ModelCleanupServiceProvider"
这是已发布的配置文件model-cleanup.php
的内容。
return [ /* * All models in this array that implement `Spatie\ModelCleanup\GetsCleanedUp` * will be cleaned. */ 'models' => [ // App\Models\YourModel::class, ], ];
可选地,您可以将Spatie\ModelCleanup\Commands\CleanUpModelsCommand
调度为以您希望的频率运行,以清理模型。以下是一个示例,其中所有模型将在每天午夜进行清理。
// in app/Console/Kernel.php protected function schedule(Schedule $schedule) { $schedule->command(\Spatie\ModelCleanup\Commands\CleanUpModelsCommand::class)->daily(); }
使用方法
您要清理的所有模型必须实现GetsCleanedUp
接口。在必需的cleanUp
方法中,您可以指定哪些记录被视为旧记录并应该被删除。
以下是一个示例,其中所有5天以上的记录都将被清理。
use Illuminate\Database\Eloquent\Model; use Spatie\ModelCleanup\CleanupConfig; use Spatie\ModelCleanup\GetsCleanedUp; class YourModel extends Model implements GetsCleanedUp { ... public function cleanUp(CleanupConfig $config): void { $config->olderThanDays(5); } }
接下来,您应该在model-cleanup
配置文件的models
键中注册此模型。
// in config/model-cleanup.php return [ 'models' => [ App\Models\YourModel::class, ], // ... ]
当运行控制台命令clean:models
时,所有5天以上的模型将被删除。
软删除模型
此软件包还支持清理已启用软删除功能的模型。使用Illuminate\Database\Eloquent\SoftDeletes
trait并且被视为旧的模型,将从数据库中永久删除,而不是被标记为已删除。
在CleanupConfig
上的可用方法
olderThanDays
使用此方法,您可以标记具有超过给定天数created_at
值的记录为旧记录。
以下是一个示例,其中所有5天以上的模型被视为旧记录。
public function cleanUp(CleanupConfig $config): void { $config->olderThanDays(5); }
olderThan
olderThan
方法接受一个Carbon
实例。所有在指定实例之前具有created_at
值的模型将被视为旧记录。
以下是一个示例,其中所有超过一年的模型被视为旧记录。
public function cleanUp(CleanupConfig $config): void { $config->olderThan(now()->subYear()); }
useDateAttribute
当使用olderThanDays
和olderThan
方法时,后台构建的删除查询将使用created_at
列。您可以使用useDateAttribute
方法指定替代列。
public function cleanUp(CleanupConfig $config): void { $config ->olderThanDays(5) ->useDateAttribute('custom_date_column'); }
范围
使用scope
方法可以使删除旧记录的查询更加具体。
假设您的模型有一个status
属性。只有状态为inactive
的记录可以被清理。以下是一个示例,其中所有5天前状态为inactive
的记录都将被清理。
public function cleanUp(CleanupConfig $config): void { $config ->olderThanDays(5) ->scope(fn (Illuminate\Database\Eloquent\Builder $query) => $query->where('status', 'inactive')); }
块
默认情况下,模型通过执行单个delete
查询来进行清理。当您想要清理一个非常大的表时,这个单个查询可能会锁定您的表很长时间。甚至可能根本无法获得锁。
为了解决这个问题,该包可以使用chunk
方法分批删除记录。
在这个示例中,所有5天前的记录将以1000条记录的块进行删除。
public function cleanUp(CleanupConfig $config): void { $config ->olderThanDays(5) ->chunk(1000); }
当没有更多需要删除的记录时,包将停止删除记录。
如果您需要更精细地控制何时停止删除,可以将闭包作为chunk
的第二个参数传递。闭包中返回false
将停止删除过程。
在下面的示例中,删除过程将继续进行,直到所有5天前的记录都被删除,或者模型的记录数低于5000。
public function cleanUp(CleanupConfig $config): void { $config ->olderThanDays(5) ->chunk(1000, fn() => YourModel::count() > 5000); }
事件
即使没有记录被删除,模型清理后也会触发Spatie\ModelCleanup\Events\ModelCleanedUp
事件。
它有两个公共属性:model
,包含被清理的模型实例;以及numberOfDeletedRecords
。
更新日志
请参阅更新日志以获取最近更改的更多信息。
测试
composer test
贡献
请参阅贡献指南以获取详细信息。
安全
如果您发现任何与安全相关的问题,请通过电子邮件freek@spatie.be而不是使用问题跟踪器。
明信片
您可以自由使用此包,但如果它进入您的生产环境,我们非常感谢您从家乡寄给我们一张明信片,说明您正在使用我们的哪个包。
我们的地址是:Spatie,Kruikstraat 22,2018 安特卫普,比利时。
我们将发布所有收到的明信片在我们的公司网站上。
致谢
许可证
MIT许可证(MIT)。请参阅许可证文件以获取更多信息。