Счетчик сбрасывается до нуля после каждого фрагмента Laravel импорта Excel - PullRequest
0 голосов
/ 13 июля 2020

Я импортирую CSV, используя пакет maatwebsite / excel . CSV содержит более 100 миллионов строк, поэтому я использую WithChunkReading. Я также регистрирую вставку каждой строки.

protected $rowCount = 0;

public function collection(Collection $rows): bool
{
    foreach ($rows as $row)
    {
        // Insertions here

        ++$this->rowCount;
        Log::debug('Inserted row #'.$this->rowCount);
    }
    return false;
}

public function chunkSize(): int
{
    return 10;
}

Проблема в том, что после каждого фрагмента $rowCount сбрасывается на zero.

Это то, что laravel.log выводит:

[2020-07-13 10:06:10] local.DEBUG: Вставленная строка # 1 [2020-07-13 10:06:11] local.DEBUG: Вставлена ​​строка №2 [2020-07-13 10:06:11] local.DEBUG: Вставлена ​​строка №3 [2020-07-13 10:06:11] local.DEBUG: вставлена ​​строка №4 [2020-07-13 10:06:11] local.DEBUG: Вставлена ​​строка №5 [2020-07-13 10:06:12] local.DEBUG: вставлена ​​строка №6 [2020-07-13 10:06:12] local.DEBUG: Вставлена ​​строка №7 [2020-07-13 10:06:12] local.DEBUG: вставлена ​​строка №8 [2020-07-13 10:06:12] local.DEBUG: Вставлена ​​строка №9 [2020-07-13 10:06:13] local.DEBUG: вставлена ​​строка №10 [2020-07-13 10:06:16] local.DEBUG: вставлена ​​строка №1 [2020-07-13 10:06:16] local.DEBUG: Вставлена ​​строка №2 [2020-07-13 10:06:16] local.DEBUG: Вставлена ​​строка # 3

Я также пробовал использовать $rowCount по ссылке в закрытии

public function collection(Collection $rows): bool
{
    $rowCount = 0;
    foreach ($rows as $row)
    {
        // Insertions here

        $counter = function() use(&$rowCount){
            return ++$rowCount;
        };
        Log::debug('Inserted row #'.$counter->call($row));
    }
    return false;
}

Но результат все тот же.

Обновление : Я пытался получить доступ к счетчику извне методом collection -

protected $rowCount = 0;

public function collection(Collection $rows): bool
{
    foreach ($rows as $row)
    {
        // Insertions here

        $rowCount = $this->incrementCounter();
        Log::debug('Inserted row #'.$rowCount);
    }
    return false;
}

protected function incrementCounter(){
    return ++$this->rowCount;
}

public function chunkSize(): int
{
    return 10;
}

Это, однако, тоже не помогло . Счетчик по-прежнему сбрасывается обратно.

Как я могу сохранить значение $rowCount, чтобы оно не сбрасывалось обратно на 0 после каждого фрагмента?
TIA!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...