Laravel Multi Insert问题,引用值

时间:2016-09-22 08:40:13

标签: php laravel eloquent laravel-5.2

我需要在数据库表中插入大量记录。我从CSV文件中获取数据。我考虑过使用多插入语句以获得良好的性能。所以我做了类似以下的事情:

 foreach($data as $key => $value) {

   $insert[] = [
                'id' => $value->id, 'is_published' => $value->is_published,
                "first_name" => $value->first_name, "middle_name" => $value->middle_name, "last_name" => $value->last_name,
                "description" => $value->description,
                "created_at" => date("Y-m-d H:i:s",strtotime($value->created_at)),
                "updated_at" => date("Y-m-d H:i:s",strtotime($value->changed_at))
            ];
 }

 if(!empty($insert)){
     Model::insert($insert);
 }

但是这样做我总是看到错误:

  

mysql服务器消失了。

我通过打印查询来调试它,我发现通过这样做,Laravel并没有在描述值中处理单引号或双引号,因为它在使用$model::save();时会自动执行。如果描述值中包含单引号'或双引号",则打印的查询版本会中断。

但是,如果我做一些像

这样的事情
foreach($data as $key=>$value){
   $model = new Model();
   $model->id = $value->id;
   $model->description = $value->description;
   blah blah bla

   $model->save();
}

它成功运行而不会产生任何错误。任何人都可以告诉我如何纠正这个问题吗?

2 个答案:

答案 0 :(得分:2)

由于大量数据集引号问题没有错。当您尝试使用多插入一次插入所有行时,数据集变得太重。您需要增加max_allowed_pa​​cket,或者您需要以块的形式进行操作。 你可以使用chunk。 假设您想一次插入100个元素。你可以做那样的事。

 if(!empty($insert))
 {

    $collection = collect($insert)->chunk(100)->toArray();

    foreach ($collection as $insert)
    {
       // It will insert 100 items at a time

        Model::insert($insert);
    }

 }

希望这会有所帮助:)

答案 1 :(得分:0)

您尝试批量插入多少记录? 你能尝试两个吗? 你可以尝试制作几个批量插入(如100乘100)。

通常,错误Mysql has gone away表示数据库服务器终止查询,因为它等待的数据太多(查询太大)。

您通常可以在my.conf中为max_allowed_packet var设置更高的值,以便一次发送更多数据。