elipzis/laravel-pastable-model

剪切/复制并粘贴 Laravel Eloquent 模型数据到另一个表

v0.2.0 2024-03-25 07:57 UTC

This package is auto-updated.

Last update: 2024-09-08 07:25:45 UTC


README

Latest Version on Packagist GitHub Tests Action Status GitHub Code Style Action Status Total Downloads

使您的模型能够定期将其数据剪切/复制并粘贴到另一个表中。

  • 剪切/复制或复制/粘贴
  • 提供定期和异步运行的计划任务
  • 分块剪切/复制,以分割潜在的长时间运行的过程
  • 将数据存储到例如日志表或每日表中,以保持生产数据的清洁

安装

您可以通过 composer 安装此包

composer require elipzis/laravel-pastable-model

您可以使用以下命令发布配置文件

php artisan vendor:publish --tag="pastable-model-config"

这是已发布的配置文件的内容

return [
    //The default cut&paste chunk size (limit)
    'chunkSize' => 1000,
    //Auto-create tables, if not existing
    'autoCreate' => false,
    //Enable detailed logging to any accepted and configured level
    'logging' => [
        'enabled' => false,
        'level' => null,
    ],
];

使用方法

要使您的模型可复制和粘贴,请添加 trait CopyPastable。它将复制并粘贴您配置的查询结果到目标表中。

...
use ElipZis\Pastable\Models\Traits\CopyPastable;
...

class YourModel extends Model {

    use CopyPastable;    
    ...

要使您的模型可剪切和粘贴,请添加 trait CutPastable。它将剪切(删除)并粘贴您配置的查询结果到目标表。如果影响的行数超过块大小(限制),它将重新启动自己的作业直到完成。

...
use ElipZis\Pastable\Models\Traits\CutPastable;
...

class YourModel extends Model {

    use CutPastable;    
    ...

配置

要使用任何 trait,您需要配置两个设置

  • 目标表
  • 查询以从中读取其数据

目标表 (必填)

您必须定义目标表名。

...

class YourModel extends Model {

    ...
    protected string $pastableTable = 'log_something';    
    ...

或通过重写getter函数,例如创建动态表名

...

class YourModel extends Model {

    ...
    public function getPastableTable(): string
    {
        return 'log_something_' . Carbon::now()->format('Y_m_d');
    }
    ...

如果表不存在,您可以使用配置设置 autoCreate 并将其设置为 true 以让系统尝试从您的查询源创建表。

建议您手动创建表或通过迁移创建,因为自动化尚未在所有数据库系统和表结构中完全测试和功能化。

查询 (必填)

您必须定义用于读取数据并将其剪切/复制并粘贴到目标表的查询。

...

class YourModel extends Model {

    ...
    public function getPastableQuery(): Builder
    {
        return static::query()->where('created_at', '<=', now()->subDay());
    }
    ...

您可以使用任何返回 Builder 对象的查询。

在剪切/复制的案例中,默认的 chunkSize 被用作限制器。您可以通过在查询中添加 ->limit() 或覆盖一般配置设置来自定义限制。

连接 (可选)

如果您想目标表在另一个数据库中创建和填充,则可以提供单独的连接。

...

class YourModel extends Model {

    ...
    protected string $pastableConnection = 'logging';    
    ...

运行

实现和配置后,您有三个选项来触发剪切/复制作业

  • 手动调度作业
  • 计划调度
  • 运行命令以手动触发

计划

首选的方法是通过 Kernel 配置计划来运行作业,例如每日运行

namespace App\Console;

...
use ElipZis\Pastable\Jobs\PastableJob;
...

class Kernel extends ConsoleKernel

    ...
    protected function schedule(Schedule $schedule)
    {
        ...
        $schedule->job(PastableJob::class)->daily();
        ...
    }
    ...

通过命令

您也可以使用命令手动触发执行

  • 所有可剪切/复制模型类:php artisan pastable:all
  • 仅复制/粘贴模型类:php artisan pastable:copy
  • 仅剪切/粘贴模型类:php artisan pastable:cut

手动调度

最后一个选项是在您函数中的任何逻辑、任何应用程序代码中手动触发作业

...
use ElipZis\Pastable\Jobs\PastableJob;
...

class YourClass

    ...
    protected function yourFunction()
    {
        ...
        PastableJob::dispatch();
        ...
    }
    ...

测试

composer test

注意

此包深受以下两个出色资源的启发

向两者致敬和感谢。

更新日志

有关最近更改的更多信息,请参阅更新日志

贡献

请参阅贡献指南以获取详细信息。

安全漏洞

请查阅我们的安全策略了解如何报告安全漏洞。

鸣谢

许可证

MIT许可证(MIT)。请参阅许可证文件以获取更多信息。