Laravel模型自动硬删除需求:软删除30天后自动彻底删除
实现Laravel软删除记录自动硬删除(30天后)
嘿,既然你已经搞定了软删除、恢复和手动硬删除的功能,那给你加上自动清理30天前软删记录的机制就很简单啦,咱们分几步来:
1. 创建自定义Artisan命令
首先咱们需要一个专门的命令来处理过期软删记录的清理:
php artisan make:command PruneSoftDeletedUsers
这个命令会在app/Console/Commands目录下生成一个PruneSoftDeletedUsers.php文件,咱们修改它的handle方法:
<?php namespace App\Console\Commands; use App\Models\User; use Illuminate\Console\Command; class PruneSoftDeletedUsers extends Command { protected $signature = 'users:prune-soft-deleted'; protected $description = '永久删除30天前被软删除的用户'; public function handle() { $prunedCount = User::onlyTrashed() ->where('deleted_at', '<=', now()->subDays(30)) ->forceDelete() ->count(); $this->info("成功永久删除 {$prunedCount} 个过期软删用户"); } }
这里用onlyTrashed()只查询软删的记录,然后筛选出deleted_at早于30天前的,最后用forceDelete()执行硬删除,还统计了删除数量方便日志查看。
2. 配置任务调度
接下来要让Laravel自动执行这个命令,打开app/Console/Kernel.php,在schedule方法里添加调度规则:
protected function schedule(Schedule $schedule) { // 其他调度任务... // 每天凌晨2点执行一次清理命令 $schedule->command('users:prune-soft-deleted')->dailyAt('02:00'); }
你可以根据需求调整执行频率,比如->daily()(每天任意时间)、->weekly()(每周一次)都可以。
3. 测试与部署
- 本地测试:直接运行
php artisan users:prune-soft-deleted,看看是不是能正确删除符合条件的记录。 - 服务器部署:别忘了在服务器上配置Cron,让Laravel的调度器能定时运行,只需要在Cron里添加一行:
* * * * * cd /path-to-your-project && php artisan schedule:run >> /dev/null 2>&1
这样一来,系统就会自动帮你清理30天前的软删用户啦,不用再担心管理员忘记手动处理~
内容的提问来源于stack exchange,提问作者mafortis
相关产品推荐
相关产品推荐

