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();
    }

}

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