主页/PHP笔记/PHP问答/框架Laravel/Eloquent:如何自动删除N天后的旧记录

Eloquent:如何自动删除N天后的旧记录

Bug编译狮

Bug编译狮

Eloquent 是 Laravel 框架中的一个强大 ORM(对象关系映射),它简化了与数据库的交互。要实现自动删除 N 天后的旧记录,可以通过以下步骤来完成:

  1. 定义模型: 首先,你需要创建一个 Eloquent 模型来代表你要操作的数据表。

    // app/Models/Record.php
    
    namespace AppModels;
    
    use IlluminateDatabaseEloquentModel;
    use CarbonCarbon;
    
    class Record extends Model
    {
       protected $fillable = ['name', 'created_at'];
    
       public function deleteOldRecords($days)
       {
           $thresholdDate = Carbon::now()->subDays($days);
           return $this->where('created_at', '<=', $thresholdDate)->delete();
       }
    }
  2. 使用模型方法: 在你的控制器或其他地方,你可以调用 deleteOldRecords 方法来删除 N 天前的旧记录。

    // app/Http/Controllers/RecordController.php
    
    namespace AppHttpControllers;
    
    use AppModelsRecord;
    use IlluminateHttpRequest;
    
    class RecordController extends Controller
    {
       public function deleteOldRecords(Request $request)
       {
           $days = $request->input('days');
           if ($days) {
               $result = Record::deleteOldRecords($days);
               if ($result) {
                   return response()->json(['message' => 'Old records deleted successfully'], 200);
               } else {
                   return response()->json(['error' => 'Failed to delete old records'], 500);
               }
           } else {
               return response()->json(['error' => 'Missing days parameter'], 400);
           }
       }
    }
  3. 路由配置: 确保你在路由文件中配置了相应的路由。

    // routes/web.php
    
    use AppHttpControllersRecordController;
    
    Route::post('/delete-records', [RecordController::class, 'deleteOldRecords']);
  4. 示例请求: 使用 Postman 或其他 HTTP 客户端发送 POST 请求到 /delete-records 路由,并传递 N 天数作为参数。

    curl -X POST http://localhost:8000/delete-records -H "Content-Type: application/json" -d '{"days": 7}'

通过以上步骤,你就可以实现自动删除 N 天后的旧记录的功能。

黑板Bug讲师

黑板Bug讲师

介绍

在开发应用程序时,自动删除旧记录以保持数据库整洁是一项常见的需求。本教程将探讨如何使用Laravel的ORM(对象关系映射)和Eloquent设置一个自动删除机制,以便在一定天数后删除记录。

理解李奥普拉斯修剪

Laravel的内置ORM称为eloquent,它提供了一个表示数据库表的eloquent模型。在Laravel 8.x及更高版本中引入了名为模型修剪的新特性,这有助于解决这种场景。

自动修剪:基础知识

为了利用这一功能,您的模型需要使用它。IlluminateDatabaseEloquentPrunable特性。这个特性提供了你需要覆盖的方法,以便定义记录何时被认为是过时并被清除。

namespace AppModels;

use IlluminateDatabaseEloquentModel;
use IlluminateDatabaseEloquentPrunable;

class YourModel extends Model
{
    use Prunable;

    protected function pruning() {
        return $this->where('created_at', '<=', now()->subDays(30));
    }
}

例如,这里作为例子,pruning方法定义为自动删除超过30天的记录。该方法使用了Carbon库。subDays计算日期和时间的。where过滤记录的条目声明。

设置定时修剪

为了自动触发修剪过程,你需要在Laravel中设置一个调度器来运行这个过程。prune命令。

// AppConsoleKernel.php

protected function schedule(Schedule $schedule)
{
    $schedule->command('model:prune', [
        '--model' => [YourModel::class],
    ])->daily();
}

这将安排修剪过程每天进行。但是,可以根据需要通过使用如调整频率等方法来修改此设置。hourly好的,请发送你需要翻译的内容。weekly等等。

自动化定时任务

在定义了时间表后,请别忘了在服务器上设置任务调度器的cron条目以运行Laravel调度器。

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

它将运行。schedule:run每分钟检查是否有任何预定命令到期。

高级修剪条件

在基本用途之外,您可能需要扩展逻辑以处理更复杂的场景,例如软删除记录。根据您的应用程序逻辑,可以在查询内部进行细化调整。pruning继续使用方法。

// If you're using SoftDeletes and want to prune soft deleted records...
protected function pruning() {
    return $this->onlyTrashed()->where('deleted_at', '<=', now()->subDays(30));
}

手动触发修剪

在开发或其他操作期间,手动启动过程也是必要的,因为虽然批量修剪可能高效,但您也可能需要手动执行此过程。

php artisan model:prune --model=AppModelsYourModel

完成修剪后,您会看到确认信息。

处理修剪事件

Laravel 在修剪之前和之后会触发事件:eloquent.prune: *your model class*and 是中文中的“并且”的意思。eloquent.pruned: *your model class*在您的应用程序中,您可以监听以下内容:

Event::listen('eloquent.prune: AppModelsYourModel', function ($model) {
    // Do stuff before pruning
});
Event::listen('eloquent.pruned: AppModelsYourModel', function ($model) {
    // Do stuff after pruning
});

定制修剪逻辑

也许你需要在修剪发生时采取其他行动或调整逻辑;你可以覆盖这些行为。pruneAll方法来完全定制行为。

protected function pruneAll()
{
    // Your custom logic for pruning.
}

考虑修剪策略时应考虑以下因素:1. 环境条件,包括光照、湿度和温度等;2. 植物的生长习性;3. 预期的开花结果情况。

在实施剪枝之前,考虑表的大小、剪枝频率以及业务逻辑,以确保应用的稳定性和性能不受影响。定期备份数据库,以防意外数据丢失。

结论。

在本教程中,我们已经介绍了如何通过自动删除指定天数内不再需要的Eloquent记录来减少旧数据。定期修剪过时的信息可以节省数据库空间,降低存储成本,并通常提高性能。请确保在部署到生产环境之前,在非生产环境中彻底测试任何修剪策略,以确保其按预期工作。

长工码奴1523

长工码奴1523

为了实现自动删除指定日期后(假设为N天)的旧记录功能,我们可以使用Eloquent ORM结合MySQL数据库。以下是如何操作的一个例子:

首先,确保你已经安装了Eloquent和PHP,并且已将数据库连接到服务器上。

  1. 首先创建一个模型类来存储数据:
    
    <?php

use IlluminateDatabaseEloquentModel;

class Record extends Model { protected $fillable = [‘content’, ‘timestamp’];

public function getTimestampAttribute($value)
{
    return new DateTime($value);
}

}


2. 然后创建一个迁移文件来定义表结构:
```sql
<?php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreateRecordsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('records', function (Blueprint $table) {
            $table->id();
            $table->string('content');
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('records');
    }
}
  1. 在控制器中创建一个新的方法来处理删除操作:
    
    <?php

namespace AppHttpControllers;

use IlluminateHttpRequest; use AppModelsRecord;

class RecordsController extends Controller { public function deleteOld(Request $request, int $days) { $record = Record::whereDate(‘timestamp’, ‘<=’, date(“Y-m-d”, strtotime(“-$days days”)))->delete();

    if ($record) {
        return response()->json(['status' => 'success']);
    } else {
        return response()->json(['status' => 'error'], 500);
    }
}

}


4. 最后,在应用中注册这个控制器:
```php
<?php

namespace AppHttpControllers;

use IlluminateHttpRequest;
use AppModelsRecord;

class RecordsController extends Controller
{
    public function __construct() {
        $this->middleware('auth:api');
    }

    public function deleteOld(Request $request, int $days)
    {
        $record = Record::whereDate('timestamp', '<=', date("Y-m-d", strtotime("-$days days")))->delete();

        if ($record) {
            return response()->json(['status' => 'success']);
        } else {
            return response()->json(['status' => 'error'], 500);
        }
    }
}

以上代码演示了一个基本的自动删除功能,它会在特定日期之后删除所有与该日期相隔N天的数据。你可以根据需要调整逻辑和参数以满足你的需求。