使用 Quicksand 轻松删除旧的软删除记录
发布时间 作者 Diaa Fares
在构建应用程序时,有时您希望允许用户从他们的视图中删除数据,但将记录保留在数据库中。例如,可以允许用户删除他们的帐户,但您希望给他们机会以后重新启动帐户。如果所有数据都被完全删除,那么他们将不得不从头开始。
Laravel 的 Eloquent 提供了开箱即用的这种功能,当模型被软删除时,它们不会从数据库中删除。相反,会存储一个 deleted_at 属性。数据库记录仍然存在,Eloquent 会忽略它,除非通过 withTrashed
属性明确告知。
这方面的一个问题是,随着时间的推移,您的软删除记录会填满您的数据库并占用大量空间。
Tighten Co. 最近发布了一个名为 **“Quicksand”** 的新包,它将通过自动执行和调度旧的软删除记录的删除来帮助您解决这个问题。
**Quicksand** 是一个 Artisan 命令,您可以通过 Laravel 计划程序运行它,以强制删除您的软删除记录。您可以指定要清理的类、记录应该保留多长时间,它会完成剩下的工作。让我们来看看这个包。
安装
首先,通过 Composer 安装 **Quicksand**
composer require tightenco/quicksand
然后在 **config/app.php** 中添加 Quicksand 服务提供者
'providers' => [ ... Tightenco\Quicksand\QuicksandServiceProvider::class,
之后,您应该发布 Quicksand 配置以根据需要进行编辑,在您的终端中运行以下命令
php artisan vendor:publish --provider="Tightenco\Quicksand\QuicksandServiceProvider"
最后,通过在 **app/Http/Console/Kernel.php** 中添加以下命令来调度该命令
protected function schedule(Schedule $schedule){ $schedule->command('quicksand:run') ->daily();}
Quicksand 选项
让我们看看 Quicksand 中可用的选项,这些选项在 **config/quicksand.php** 文件中提供
return [ // Days before deleting soft deleted content 'days' => 30, // Whether to log the number of soft deleted records per model 'log' => false, // List of models to run Quicksand on 'models' => [ // Example::class, // User::class => [ // 'days' => '30' // per-model days setting override // ] ]];
首先,您可以选择设置永久删除前的日期,可以选择开启或关闭软删除记录数量的日志记录。最后,最重要的选项是 **“models”** 数组,您可以在其中添加您希望 Quicksand 对其执行清理过程的模型列表。
您可以像这样添加您的模型
User::class,
或者,如果您想要更多控制,您可以像这样独立地覆盖特定模型的日期
Post::class => [ 'days' => '60' // per-model days setting override]
如果您想知道它是如何工作的,这里就是它的核心
Quicksand 所做的是使用 onlyTrashed
方法获取所有软删除记录,然后基于 deleted_at
列进行限制,当它小于配置日期时,最后强制删除结果。
就是这样,简单的选项,易于使用,非常方便的包。如果您想自动清理您的软删除记录,请尝试一下,您可以在 Github 上查看 **Quicksand** 的源代码
另一个与 Quicksand 搭配使用的很好包是 级联软删除,当您想删除所有关联时。