php 脚本修复大批量数据,分段执行,以及进度条显示(laravel)

场景:
正常我们写修复数据脚本 可能一下会吧所有记录查出来循环去修复,
解决方法:
如果数据量大的话,就需要分页去处理,如下脚本可以看出,脚本每次读取1000条去处理,处理完并且自动继续读取下一个1000条

修复脚本:
需求是:新加了一张订单统计表,需要把订单表之前所有的订单的每条金额按人分组进行统计总和插入统计表中
在这里插入图片描述

下面代码片段是我laravel项目的一个定时任务中的一修复
(下面变量collection和model固定写法(model相当于我给SubOrder模型起个别名):SubOrder是我的订单模型)

private function fixSuborderAddCostPrice(){
        $query = SubOrder::query();
        $bar   = $this->output->createProgressBar($query->count());
        $query
            ->chunk(1000, function (Collection $collection) use ($bar) {
                $collection->each(function (SubOrder $model) use ($bar) {
                    $sku = GoodsSkues::where(['id'=>$model->sku_id])->first();
                    if($sku){
                        $model->cost_price = $sku->cost_price * $model->number;
                        $model->save();
                    }
                    
                    $bar->advance();
                });
            });
        $bar->finish();
    }
<?php

namespace App\Console\Commands\Repair;

use App\Jobs\CreateGoodsPosterJob;
use App\Jobs\GetRedPacketListJob;
use App\Models\EarnDaily;
use App\Models\EarnLogs;
use App\Models\Mall\Goods;
use App\Models\Mall\GoodsPoster;
use App\Models\Mall\GoodsSkues;
use App\Models\Mall\SubOrder;
use App\Models\Orders;
use App\Models\Search\GoodsDevelop;
use App\Models\Search\GoodsProduct;
use App\Models\User;
use App\Models\UserOauth;
use App\Models\UserOauthYff;
use App\Models\UserWallets;
use App\Services\OssService;
use App\Services\SuborderService;
use Illuminate\Console\Command;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Support\Carbon;
use Illuminate\Support\Facades\Log;
use Illuminate\Support\Facades\Mail;
use Predis\Client;
use Tymon\JWTAuth\Facades\JWTAuth;
use ETaobao\Factory;
use App\Services\TaoBaoService;
use App\Models\Items;
use App\Models\ItemCategory;
use Illuminate\Support\Facades\DB;

class repairStatisticsData extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'repairStatisticsData';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = '修复统计报表相关数据';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        #修复直接和间接粉丝数
        $this->fixSuborderAddCostPrice();
    }

    #修复子订单表新加成本价字段
    private function fixSuborderAddCostPrice(){
        $query = SubOrder::query();
        $bar   = $this->output->createProgressBar($query->count());
        $query
            ->chunk(1000, function (Collection $collection) use ($bar) {
                $collection->each(function (SubOrder $model) use ($bar) {
                    $sku = GoodsSkues::where(['id'=>$model->sku_id])->first();
                    if($sku){
                        $model->cost_price = $sku->cost_price * $model->number;
                        $model->save();
                    }
                    
                    $bar->advance();
                });
            });
        $bar->finish();
    }

}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章