2016-09-22 56 views
10

我需要在数据库表中插入一大组记录。我从CSV文件中获取数据。我想过使用多插入语句来获得良好的性能。所以,我做类似下面的东西:Laravel多插入问题的值

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 server gone away error.

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

但是,如果我做一些东西一样

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

    $model->save(); 
} 

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

+0

请使用laravel交易插入多条记录。 – Komal

+0

@Komal它与我的问题有什么关系? –

+1

奇怪的行为...我没有做批量插入,但我会试试这个:'str_replace(''','',',$ value-> description)',只是一个想法... –

回答

2

它由于大型数据集没有错引号问题。当您尝试使用多重插入一次插入所有行时,数据集变得太重。您需要增加max_allowed_pa​​cket,或者您需要分块。 你可以使用块。假设你想要一次插入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); 
    } 

} 

希望这将有助于:)

+0

请再次阅读我的问题 –

+1

@AwaisQarni我认为这个答案实际上解决了这个问题,因为'MySQL server has has走了'错误可能是由持续太久的查询造成的,而不是引号。 – Skysplit

+0

接受这个答案是正确的使得问题相当无价值(答案没有错,这也是我的猜测) –

0

您试图批量插入多少条记录? 你可以尝试只有两个? 您可以尝试制作几张大容量插页(如100×100)。

通常,错误Mysql has gone away意味着数据库服务器杀死了查询,因为它正在等待太多数据(您的查询太大)。

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

+0

请再次阅读我的问题 –