首页 > 解决方案 > 处理完所有作业后,Laravel 作业从数组中获取总数

问题描述

在我的 Laravel 8 应用程序中,我使用 Jobs 和 Batches 来分块,并处理从 CSV 插入多行数据。上传时,我的 CSV 被分块,一个批次包含所有作业,每个作业有 1,000 条记录要插入,因此作业循环遍历每条记录,并通过我用于格式化数据的函数将它们插入数据库。

我想在导入与批处理相关的所有作业期间创建某种累积错误总数,但不确定如何执行此操作,因为现在它仅在每 1,000 个客户被导入后运行,而我已经有50k。

如何在所有正在处理的作业结束时获得所有可能抛出的错误的总数?

<?php

namespace App\Jobs;

use Illuminate\Bus\Batchable;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldBeUnique;
use Illuminate\Contracts\Queue\ShouldQueue;
use Illuminate\Foundation\Bus\Dispatchable;
use Illuminate\Queue\InteractsWithQueue;
use Illuminate\Queue\SerializesModels;

use Illuminate\Support\Facades\Log;

use Carbon\Carbon;

class CustomersCsvProcess implements ShouldQueue
{
    use Batchable, Dispatchable, InteractsWithQueue, Queueable, SerializesModels, ApplicationSecurity, Applications;

    /**
     * Hold CSV errors
     */
    protected $csvErrors = [];

    /**
     * Data
     */
    public $data;

    /**
     * Header
     */
    public $header;

    /**
     * Create a new job instance.
     *
     * @return void
     */
    public function __construct($data, $header)
    {
        $this->data = $data;
        $this->header = $header;
    }

    /**
     * Execute the job.
     *
     * @return void
     */
    public function handle()
    {

        foreach ($this->data as $customer) {
          $customerData = array_combine($this->header, (array) $customer);
          $formattedCustomer = null;

          // format applicant to insert
          try {
            $formattedCustomer = $this->mapApplication($customerData);
          } catch (\Exception $e) {
            array_push($this->csvErrors, $e->getMessage());
          }
        }

        // TODO: how to log $dumpErrors after all 50k insertted rather than after each job?
        $dumpErrors = array_count_values($this->csvErrors);
        var_dump($dumpErrors);

    }
}

标签: phplaravel

解决方案


推荐阅读