我使用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时,我的内存不足。使用WithBatchInserts
和chunkSize()
设置为5000进行尝试,然后在10000条记录后冻结导入30+秒,最终导入总共5171条记录。