codenco-dev/laravel-eloquent-pruning

此包已被废弃,不再维护。未建议替代包。

我们经常需要清理最旧或不必要的数据记录。这个包可以轻松为我们完成。

v1.2.0 2020-11-27 18:05 UTC

This package is auto-updated.

Last update: 2023-01-27 22:45:31 UTC


README

Latest Version on Packagist GitHub Tests Action Status Total Downloads

我们经常需要通过删除最旧和无关数据来清理数据库中的记录。此包通过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 的启发。