nexusbrother/laravel-archivable is a Laravel package for this is laravel extension packages.
It currently has 0 GitHub stars and 13 downloads on Packagist (latest version 1.0.1).
Install it with composer require nexusbrother/laravel-archivable.
Discover more Laravel packages by nexusbrother
or browse all Laravel packages to compare alternatives.
Last updated
Laravel Archivable 是一个数据库记录归档扩展包,能够将过期记录从主库自动迁移到独立的归档数据库,同时保持表结构同步。
DateFieldArchivable)MonthlyArchivable)ModelsArchived 事件,方便自定义后续逻辑composer require nexusbrother/laravel-archivable
发布配置文件:
php artisan vendor:publish --provider="Nexusbrother\Archivable\ServiceProvider" --tag="config"
在 config/database.php 的 connections 中添加 archive 连接:
'archive' => [
'driver' => 'mysql',
'host' => env('ARCHIVE_DB_HOST', '127.0.0.1'),
'port' => env('ARCHIVE_DB_PORT', '3306'),
'database' => env('ARCHIVE_DB_DATABASE', 'archive'),
'username' => env('ARCHIVE_DB_USERNAME', 'root'),
'password' => env('ARCHIVE_DB_PASSWORD', ''),
'charset' => 'utf8mb4',
'collation'=> 'utf8mb4_unicode_ci',
'prefix' => '',
'strict' => true,
'engine' => null,
],
# 启用定时归档任务(默认 false)
ARCHIVE_ENABLE=true
# 归档数据库连接名(默认 archive)
ARCHIVE_DB_CONNECTION=archive
# 定时任务执行时间
ARCHIVE_SCHEDULE_STRUCTURE_SYNC_DAILY_AT=09:00
ARCHIVE_SCHEDULE_ARCHIVE_DAILY_AT=09:10
config/archive.php:
return [
// 是否启用定时归档任务
'enable' => env('ARCHIVE_ENABLE', false),
// 定时任务执行时间
'schedule_daily_at' => [
'archive_structure_sync' => '09:00', // 表结构同步
'archive' => '09:10', // 数据归档
],
// 每批处理的记录数
'default_chunk_size' => 1000,
// 归档数据库连接名
'db' => env('ARCHIVE_DB_CONNECTION', 'archive'),
// 自动扫描 Archivable 模型的目录
'model_paths' => [
app_path('Models'),
],
];
适合按时间归档的场景,所有记录归档到同一张目标表:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Nexusbrother\Archivable\DateFieldArchivable;
class Order extends Model
{
use DateFieldArchivable;
/**
* 可选:自定义日期字段(默认 created_at)
*/
public function getDateField(): string
{
return 'created_at';
}
/**
* 可选:自定义归档时间界限(默认 6 个月前)
*/
public function getDateLimit()
{
return today()->subYear();
}
/**
* 可选:自定义归档目标表名(默认与源表同名)
*/
public function getDestinationTable(): string
{
return $this->getTable() . '_' . now()->format('Ym');
}
}
适合日志、消息等按月分区的数据,每个月的记录归档到独立的月表(如 logs_202501、logs_202502):
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Nexusbrother\Archivable\MonthlyArchivable;
class Log extends Model
{
use MonthlyArchivable;
/**
* 可选:自定义日期字段(默认 created_at)
*/
public function getDateField(): string
{
return 'created_at';
}
/**
* 可选:归档多少个月之前的数据(默认 6 个月)
*/
public function getArchiveMonthLimit()
{
return today()->subMonths(3);
}
}
完全自定义归档逻辑:
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Model;
use Nexusbrother\Archivable\Archivable;
class User extends Model
{
use Archivable;
/**
* 定义可归档的记录查询
*/
public function archivable()
{
return $this->where('last_login_at', '<', now()->subYear());
}
/**
* 可选:自定义归档目标表
*/
public function getDestinationTable(): string
{
return 'archived_users';
}
}
归档前先同步表结构,确保归档表存在且字段一致:
# 同步所有 Archivable 模型
php artisan model:archive-structure-sync
# 指定模型
php artisan model:archive-structure-sync --model="App\Models\Order"
# 排除模型
php artisan model:archive-structure-sync --except="App\Models\User"
# 归档所有已注册模型
php artisan model:archive
# 指定模型
php artisan model:archive --model="App\Models\Order" --model="App\Models\Log"
# 排除模型
php artisan model:archive --except="App\Models\User"
# 自定义 chunk 大小
php artisan model:archive --chunk=500
# 仅预览,不执行
php artisan model:archive --pretend
执行时会显示实时进度条:
4532/50000 [▓▓▓░░░░░░░░░░░░░░░░░] 9%
// 归档单个记录
$order->archive();
// 归档所有符合条件的记录
$order->archiveAll();
// 自定义 chunk 大小
$order->archiveAll(500);
// 带进度回调(每处理完一个 chunk 触发)
$order->archiveAll(1000, function (int $chunkCount) {
// 处理了 $chunkCount 条记录
});
// 带开始回调和进度回调
$order->archiveAll(1000, function (int $chunkCount) {
// 每批完成
}, function (int $total) {
// 开始归档,共 $total 条待处理
});
归档完成后触发 ModelsArchived 事件:
use Illuminate\Support\Facades\Event;
use Nexusbrother\Archivable\ModelsArchived;
Event::listen(ModelsArchived::class, function (ModelsArchived $event) {
// $event->model 被归档的模型类名
// $event->count 归档的记录数量
Log::info("Archived {$event->count} records from {$event->model}");
});
包内置两个定时任务,在 config('archive.enable') 为 true 时自动注册:
| 任务 | 默认时间 | 说明 |
|------|---------|------|
| model:archive-structure-sync | 09:00 | 同步所有 Archivable 模型的归档表结构 |
| model:archive | 09:10 | 执行数据归档 |
两个任务均配置了
onOneServer()和withoutOverlapping(),适合多服务器部署。
MIT License