Php Laravel CSV导入仅保存数据库中的最后一行(id正确递增)
使用Laravel6和LaravelExcel3.1,我尝试从CSV文件导入事务。 我跟着 结果是,只有最后一行被添加到数据库中。创建的ID基于正确数量的记录。当我启用进度条时,我确实看到所有行都已处理(但结果相同) 例如,我从空数据库开始,导入10条记录,导入后我看到一行包含最后一行的值,ID为10 我添加了控制台命令:Php Laravel CSV导入仅保存数据库中的最后一行(id正确递增),php,laravel,maatwebsite-excel,Php,Laravel,Maatwebsite Excel,使用Laravel6和LaravelExcel3.1,我尝试从CSV文件导入事务。 我跟着 结果是,只有最后一行被添加到数据库中。创建的ID基于正确数量的记录。当我启用进度条时,我确实看到所有行都已处理(但结果相同) 例如,我从空数据库开始,导入10条记录,导入后我看到一行包含最后一行的值,ID为10 我添加了控制台命令: $this->line('before - count: '. Transaction::count() .' - last ID: '. Transacti
$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 TransactionImport--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'],
]);
}
}
更新:添加了有关导入到集合的详细信息
更新:将
与批插入一起使用时,行为会发生变化(但仍然不稳定)。将batchSize()
设置为5000:正确导入包含3829条记录的文件,而包含12657条记录的文件仅导入最后2657条记录(前10000条记录已处理但未存储)。当batchSize()
设置为13000时,我的内存不足。尝试使用将batchInserts
和chunkSize()设置为5000,导入过程在10000条记录后冻结30秒以上,最终导入总共5171条记录。您是否尝试过使用$ModelObject->save()或$ModelObject->creat()雄辩的功能?文档中明确指出,您不应自行保存模型。():“将为您保存返回的模型。每行将导致(至少)一次保存,并且还会触发模型事件。使用ToModel时,您不应自己保存模型,因为这将破坏批插入功能。”