You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel中如何实现记录的自定义定时自动删除

在Laravel中实现记录自动过期删除的方案

所需技术/工具

  • Laravel Artisan 命令
  • Laravel 任务调度(Schedule)
  • Carbon 日期处理类
  • 可选:MySQL 事件调度(数据库层面自动清理)

具体实现步骤

1. 调整数据库表结构

给需要自动删除的表添加expires_at字段,用来存储自定义过期时间(表默认自带的created_at字段无需额外添加):

ALTER TABLE your_table_name ADD COLUMN expires_at DATETIME NULL;

2. 创建自动删除的Artisan命令

执行以下命令生成自定义清理命令:

php artisan make:command DeleteExpiredRecords

打开生成的app/Console/Commands/DeleteExpiredRecords.php,编写核心删除逻辑:

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use App\Models\YourModel; // 替换为你的实际模型类
use Carbon\Carbon;

class DeleteExpiredRecords extends Command
{
    protected $signature = 'records:delete-expired';
    protected $description = '清理过期记录(自定义过期时间或超过固定周期)';

    public function handle()
    {
        // 1. 删除已到自定义过期时间的记录
        YourModel::whereNotNull('expires_at')
            ->where('expires_at', '<=', Carbon::now())
            ->delete();

        // 2. 删除创建时间超过指定周期的记录
        $timePoints = [
            Carbon::now()->subYear(),
            Carbon::now()->subMonths(6),
            Carbon::now()->subDays(15)
        ];

        YourModel::where(function ($query) use ($timePoints) {
            foreach ($timePoints as $time) {
                $query->orWhere('created_at', '<=', $time);
            }
        })->delete();

        $this->info('过期记录清理完成');
    }
}

3. 配置任务调度

打开app/Console/Kernel.php,在schedule方法中设置命令的执行频率,例如每天凌晨2点执行:

protected function schedule(Schedule $schedule)
{
    $schedule->command('records:delete-expired')->dailyAt('02:00');
}

4. 配置服务器Cron(关键步骤)

Laravel的任务调度依赖服务器Cron服务,需在服务器上添加以下Cron条目(替换为你的项目实际路径):

* * * * * cd /path/to/your/laravel/project && php artisan schedule:run >> /dev/null 2>&1

可选:数据库层面自动清理(无需依赖Laravel调度)

若不想依赖Laravel调度系统,可直接用MySQL事件调度实现定期清理,例如创建每天执行的清理事件:

CREATE EVENT delete_expired_records
ON SCHEDULE EVERY 1 DAY
STARTS CURRENT_DATE + INTERVAL 2 HOUR
DO
BEGIN
    DELETE FROM your_table_name WHERE expires_at <= NOW() AND expires_at IS NOT NULL;
    DELETE FROM your_table_name WHERE created_at <= NOW() - INTERVAL 1 YEAR;
    DELETE FROM your_table_name WHERE created_at <= NOW() - INTERVAL 6 MONTH;
    DELETE FROM your_table_name WHERE created_at <= NOW() - INTERVAL 15 DAY;
END;

内容的提问来源于stack exchange,提问作者Rose Ann

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 09:35:21