Laravel CSV导入仅将数据库的最后一行保存(ID正确增加)

时间:2019-09-08 15:02:30

标签: php laravel maatwebsite-excel

我使用Laravel 6和Laravel Excel 3.1,尝试从CSV文件导入事务。 我关注了the quickstart

结果是仅最后一行被添加到数据库。创建的ID是基于正确的记录量。当我启用进度条时,我确实看到所有行都已处理(但结果相同)。

例如我从空数据库开始,导入10条记录,导入后,我看到一行包含ID为10的最后一行的值。

我添加了控制台命令:

    $this->line('before  - count: '. Transaction::count() .' - last ID: '. Transaction::max('id'));
    Excel::import(new TransactionsImport, $file);
    $this->line('after  - count: '. Transaction::count() .' - last ID: '. Transaction::max('id'));

导入3条记录时的示例输出:

before - count: 27 - last ID: 77
after  - count: 28 - last ID: 80

当我导入一个集合时,我看到三个项目:

    $collection = Excel::toCollection(new TransactionsImport, $file);
    $this->line("raw CSV items imported into collection: ". $collection[0]->count() ); // 3

它返回集合中的集合:

Illuminate\Support\Collection^ {#975
  #items: array:1 [
    0 => Illuminate\Support\Collection^ {#978 // collection for 3 rows
      #items: array:3 [
        0 => Illuminate\Support\Collection^ {#981 // collection for 1 record
          #items: array:9 [
            "datum" => 20190905.0 // the original CSV labels+values
            ...

我使用php artisan make:import TransactionsImport --model=Transaction创建了导入模型:

class TransactionsImport implements ToModel, WithHeadingRow
{
    public function model(array $row)
    {
        return new Transaction([
            'date' => Carbon::parse($row['datum']),
            'name' => $row['naam_omschrijving'],
            'account' => $row['rekening'],
            'accountFrom' => $row['tegenrekening'],
            'mutationCode' => $row['code'],
            'afBij' => $row['af_bij'],
            'amount' => $row['bedrag_eur'],
            'mutationType' => $row['mutatiesoort'],
            'message' => $row['mededelingen'],
        ]);
    }
}

更新:添加了有关导入收藏夹的详细信息

更新:使用WithBatchInserts时,行为会发生变化(但仍然不稳定)。将batchSize()设置为5000:正确导入具有3829条记录的文件,具有12657条记录的文件仅导入最后2657条记录(前10000条已处理但未存储)。当batchSize()设置为13000时,我的内存不足。使用WithBatchInsertschunkSize()设置为5000进行尝试,然后在10000条记录后冻结导入30+秒,最终导入总共5171条记录。

0 个答案:

没有答案