elipzis / laravel-pastable-model
剪切/复制并粘贴 Laravel Eloquent 模型数据到另一个表
Requires
- php: ^8.2
- illuminate/contracts: ^10.0|^11.0
- spatie/laravel-package-tools: ^1.14.0
Requires (Dev)
- laravel/pint: ^1.0
- nunomaduro/collision: ^7.8
- nunomaduro/larastan: ^2.0.1
- orchestra/testbench: ^8.8
- pestphp/pest: ^2.0
- pestphp/pest-plugin-arch: ^2.0
- pestphp/pest-plugin-laravel: ^2.0
- phpstan/extension-installer: ^1.1
- phpstan/phpstan-deprecation-rules: ^1.0
- phpstan/phpstan-phpunit: ^1.0
- spatie/laravel-ray: ^1.26
README
使您的模型能够定期将其数据剪切/复制并粘贴到另一个表中。
- 剪切/复制或复制/粘贴
- 提供定期和异步运行的计划任务
- 分块剪切/复制,以分割潜在的长时间运行的过程
- 将数据存储到例如日志表或每日表中,以保持生产数据的清洁
安装
您可以通过 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)。请参阅许可证文件以获取更多信息。