lab2view/laravel-model-archive

dev-main 2024-09-16 18:08 UTC

README

一个简单的包,用于使Laravel Eloquent模型'可存档'。该包允许轻松地将模型存档到二级数据库,并提供必要的宏,以便在需要时检索它们。

安装

您可以通过composer安装此包

composer require lab2view/laravel-model-archive

用法

迁移

存档分为两步。第一步是将模型复制到用于存档的数据库中,第二步是检查这些模型的存档是否完成得很好,并从主数据库中删除它们。为了使此包正常工作,必须创建一个多态表,用于记录存档的可存档模型。

Schema::create('archives', function (Blueprint $table) {
    $table->id();
    $table->string("archive_with");
    $table->morphs("archivable");
    $table->timestamp('validated_at')->nullable();
    $table->timestamps();
});

要发布迁移文件,请使用

php artisan vendor:publish --provider="Lab2view\ModelArchive\ModelArchiveServiceProvider" --tag="migrations"

命令

此包提供了两个命令,分别用于将可存档模型复制到存档数据库,以及第二个命令用于验证存档并从主数据库中删除存档元素。

lab2view:model_archive
lab2view:validate_model_archive

这些命令需要直接与数据库进行交互,通过在定义为可存档的模型上执行查询。例如,使用 spiritix/lada-cache 包的 LadaCacheTrait 特性意味着对模型的查询并不总是返回 Illuminate\Database\Eloquent\Builder 接口,而是一个基于缓存的特定于此包的构建器版本。在这种情况下,在执行这些命令之前,需要执行 lada-cache:desable 命令,并在命令之后执行 lada-cache:enable

命令之间

可以通过在 between_commands 配置中注册它们来注册在命令之前或之后调用或特定命令的可调用对象。示例

class BeforeAndAfterAnything {
    public function __invoke()
    {
        // Do Anything after and before commands
    }
}

class BeforeAnything {
    public function __invoke()
    {
        Artisan::command("lada-cache:desable", ...);
    }
}

class AfterAnything {
    public function __invoke()
    {
        Artisan::command("lada-cache:enable", ...);
    }
}

function afterModelArchive(){
    // Do anything after the lab2view:model_archive command has been successfully executed
}

return [
    ...,
    'between_commands' => [
        'all' => [new BeforeAndAfterAnything],
        'before' => [
            'all' => [new BeforeAnything],
            'lab2view:model_archive' => ['afterModelArchive'],
            'lab2view:validate_model_archive' => []
        ],
        'after' => [
            'all' => [],
            'lab2view:model_archive' => [],
            'lab2view:validate_model_archive' => []
        ]
    ]
];

配置

存档需要知道用于存档的数据库[archve_db_connection]以及从中克隆可存档模型的数据库[main_db_connection]。

[
    'main_db_connection' => env('DB_CONNECTION', 'mysql'),
    'archive_db_connection' => env('ARCHIVE_DB_CONNECTION', 'archive'),
    'archive_delete_from_main' => env('ARCHIVE_DELETE_FROM_MAIN', true),
]

要发布配置文件,请使用

php artisan vendor:publish --provider="Lab2view\ModelArchive\ModelArchiveServiceProvider" --tag="config"

Eloquent

现在,您可以安全地将 Archivable 特性包含到您的Eloquent模型中

namespace App\Models;

use \Illuminate\Database\Eloquent\Model;
use Lab2view\ModelArchive\Traits\Archivable;

class Sale extends Model {

    use Archivable;
    ...
}

扩展

与此特性一起提供的扩展包括:ArchivableArchivedUnarchivedOnlyArchived,可以相应地使用。

$onlyArchivedSales = Sale::select('*')->onlyArchived();

默认情况下,此特性的全局作用域在模型添加 Archivable 特性时使用 unarchived 扩展。这可以防止操作尚未通过第二个命令验证且仍存在于源数据库中的存档模型。

许可协议

MIT 许可协议 (MIT)。有关更多信息,请参阅许可文件