codenco-dev / laravel-eloquent-pruning
我们经常需要清理最旧或不必要的数据记录。这个包可以轻松为我们完成。
Requires
- php: ^7.2.5
- illuminate/support: ^7.0|^8.0
Requires (Dev)
- friendsofphp/php-cs-fixer: ^2.16
- orchestra/testbench: ^5.0
- phpunit/phpunit: ^8.0
- psalm/plugin-laravel: ^1.3
- vimeo/psalm: ^3.11
README
我们经常需要通过删除最旧和无关数据来清理数据库中的记录。此包通过Eloquent模型使此过程更加容易。
安装
您可以通过composer安装此包
composer require codenco-dev/laravel-eloquent-pruning
配置
我们有几个可配置的选项。
pruning_column
- 用于确定记录是否应该被修剪的列名hours
- 相对于pruning_column和当前日期时间的记录应该被修剪的小时数with_delete_events
- 如果值为true,则模型的删除方法将被调用,允许触发事件。如果值为false,则删除操作将通过查询构建器完成,而不触发事件。chunk_size
- 如果with_delete_events为false,则删除查询的大小
如果所有可修剪的模型具有相同的配置,您可以在laravel-eloquent-pruning
文件中这样做。您可以使用以下命令行发布配置文件
php artisan vendor:publish --provider="CodencoDev\LaravelEloquentPruning\LaravelEloquentPruningServiceProvider" --tag="config"
如果所有可修剪的模型没有相同的配置,则每个模型的选项可以在模型文件中定义,如下所示
class MyModel extends Model { use Prunable; protected $fillable = ['id']; protected $hours = 1; protected $pruningColumn = 'updated_at'; protected $chunkSize = 1000; protected $withDeleteEvents = false; }
如果您需要更复杂的操作,您可以通过重写Prunable
特质方法来实现。
class MyModel extends Model { use Prunable; protected $fillable = ['id']; public function getHours(): int { return 1; } public function getPruningColumn(): string { return 'created_at'; } public function getChunkSize(): int { return 1000; } public function getWithDeleteEvents(): bool { return false; } }
在配置文件中,您可以管理修剪包的默认值。您必须定义将受修剪影响的模型。
'models' => [ App\MyModel::class, App\MySecondModel::class, ],
如果某些记录不能被修剪,可以使用业务逻辑,您可以使用这些方法
如果with_delete_events
为false,则业务逻辑必须放在scopeCouldBePruned
中,如下所示
/** * Scope that allows filter records for pruning. */ public function scopeCouldBePruned(Builder $query): Builder { return $query->where('status','done'); }
如果with_delete_events
为true,则业务逻辑可以放在scopeCouldBePruned
中,也可以通过重写canBePruned
方法来实现,如下所示
/** * Define if the active record can be pruned, if the ProcessWithDeleteEvents is true. */ public function canBePruned(): bool { //tests, extern call etc. return MyService::checkMyModelIsDeletable($this->id); }
用法
您可以通过修改app/Console/Kernel.php
来添加全局修剪,如下例所示
protected function schedule(Schedule $schedule) { $schedule->command('pruning:start')->hourly(); }
如果您想绕过模型小时配置,您可以使用带有hours
选项的此命令
protected function schedule(Schedule $schedule) { $schedule->command('pruning:start --hours=48])->hourly(); }
此调用允许修剪所有48小时前创建的数据。
当然,您可以使用按模型的时间表(或如果您想,创建一个专门的命令)
protected function schedule(Schedule $schedule) { $schedule->call(function(){ (new MyModel)->prune(); })->daily(); }
测试
composer test
变更日志
请参阅CHANGELOG获取有关最近更改的更多信息。
贡献
请参阅CONTRIBUTING以获取详细信息。
安全
如果您发现任何与安全相关的问题,请发送电子邮件到 dthomas@codenco.io 而不是使用问题跟踪器。
致谢
许可证
MIT许可证(MIT)。有关更多信息,请参阅 许可证文件。
Laravel 包模板
此包使用 Laravel 包模板 生成。
灵感来源
此包受到了 laravel/telescope pruning 的启发。