Laravel-将大量条目保存到数据库

时间:2018-07-09 10:27:47

标签: php mysql laravel

第一个问题,请指出是否可以澄清。 我已经使用过StackOverflow答案很多次了,所以谢谢您的帮助!

我正在开发的网站需要从CSV文件导入许多条目。 数据和保存的转换目前可以正常进行,但是由于一个文件中可以包含数千个条目,因此将数据导入数据库可能非常长。

将大型条目数组(包含每个条目的数据的数组)保存到DB的最佳方法是什么?

这是我目前正在使用的代码:

for ($i = 0; $i < count($participants); $i ++)
    {
        Participant::firstOrCreate( [ 'survey_id' => $participants[$i]['survey_id'],
            'id_importe' => $participants[$i]['id_importe'] ],
            array_merge( $participants[$i], ['token' => $savedInLime[$i]['token']] ) );
    }

我将数组的构造保留在其中,但是重要的部分是:有没有比在数组中循环并对每个条目“ firstOrCreating”更好的方法了?


编辑

我对每个包含大约3900个条目的文件使用计时器测试了这些方法。

TLDR:由于存在双循环,“ create”仅比“ firstOrCreate”和“ insert”要慢得多。

1-我将之前的代码用于firstOrCreate,耗时216s

2-我将此代码用于“创建”,并且速度稍快(205秒),但不能确保该条目不是副本

for ($i = 0; $i < count($participants); $i ++)
    {
        Participant::create( 
            'id_importe' => $participants[$i]['id_importe'] ],
            array_merge( $participants[$i], ['token' => $savedInLime[$i]['token']] ) );
    }

3-我将这段代码用于插入(也许可以使用数组函数更快地完成),并且花了460 s。 由于数据库占位符限制(我认为略高于60k),我不得不使用array_chunk。

    $tmp = array();
    for ($i = 0; $i < count($participants); $i ++){
        $tmp[] = array_merge( $participants[$i], ['token' => $savedInLime[$i]['token']] );
    }
    $inserts = array_chunk($tmp, 2000);
    foreach ($inserts as $insert){
        Participant::insert($insert);
    }

2 个答案:

答案 0 :(得分:0)

尝试一下:

$participants = [
    ['participant_id' => 11, 'survey_id' => 1),
    ['participant_id' => 22, 'survey_id' => 2),
];

Participant::insert($participants);

但它不会涉及时间戳IIRC。

答案 1 :(得分:0)

对于任何新手来说都不懂的人:

我最终保留了循环+ firstOrCreate技术,因为相比于可靠性获得的时间损失很小。