nguyenhiepvan/laravel-model-cleanup

此软件包用于删除数据库中不需要的记录。

资助软件包维护!
spatie

3.1.1 2020-08-19 03:59 UTC

README

Latest Version on Packagist Tests Psalm Total Downloads MIT Licensed

此软件包将清理旧记录。

您希望清理的模型应该有一个返回模型清理配置的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天前创建的记录。

该软件包包含各种其他方法,用于指定应删除哪些记录。

支持我们

通过观看我们的付费视频课程,了解如何创建此类软件包

Laravel Package training

我们投入了大量资源来创建最佳开源软件包。您可以通过购买我们的付费产品之一来支持我们。

我们非常感谢您从家乡寄给我们明信片,并提到您正在使用我们的哪个软件包。您可以在我们的联系页面找到我们的地址。我们将在我们的虚拟明信片墙上发布所有收到的明信片。

安装

您可以通过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

当使用olderThanDaysolderThan方法时,后台构建的删除查询将使用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)。请参阅许可证文件以获取更多信息。