2016-09-22 2 views
10

Ich muss eine große Menge von Datensätzen in eine Datenbanktabelle einfügen. Ich erhalte die Daten aus einer CSV-Datei. Ich dachte über eine Multi-Insert-Anweisung für eine gute Leistung. Also habe ich etwas Ähnliches wie die folgenden:Laravel Multi Insert Problem mit Anführungszeichen in Wert

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); 
} 

Aber damit habe ich immer die Fehlermeldung angezeigt:

mysql server gone away error.

Ich habe es ausgetestet, indem die Abfrage Druck und ich festgestellt, dass durch so tun, Laravel berücksichtigt nicht einfache Anführungszeichen oder doppelte Anführungszeichen im Beschreibungswert, wie es automatisch während usiung $model::save();. Die gedruckte Abfrageversion wird unterbrochen, wenn der Beschreibungswert einfache Anführungszeichen ' oder doppelte Anführungszeichen " enthält.

Aber wenn ich etwas tun wie

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

    $model->save(); 
} 

Es läuft erfolgreich ohne einen Fehler zu erzeugen. Kann mir jemand sagen, wie ich dieses Problem beheben kann?

+0

Bitte Laravel Transaktionen verwenden, um mehrere Datensätze einzufügen. – Komal

+0

@Komal Und wie es mit meinem Problem zusammenhängt? –

+1

wierd Verhalten ... Ich mache keine Massen-Inserts, aber ich würde versuchen: 'str_replace ('' ',' ', $ value-> Beschreibung)', nur eine Idee ... –

Antwort

2

Es aufgrund der großen Datenmenge nichts falsch mit Anführungszeichen Problem. Wenn Sie versuchen, alle Zeilen gleichzeitig mit Mehrfacheinfügung einzufügen, wird die Datenmenge zu schwer. Entweder müssen Sie das max_allowed_packet erhöhen, oder Sie müssen in Blöcken arbeiten. Sie können Chunk dafür verwenden. Angenommen, Sie möchten jeweils 100 Elemente einfügen. Sie können so etwas tun.

if(!empty($insert)) 
{ 

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

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

     Model::insert($insert); 
    } 

} 

Hope this helfen :)

+0

Bitte lesen Sie meine Frage erneut –

+1

@AwaisQarni Ich denke, diese Antwort löst tatsächlich das Problem, wie MySQL Server hat weggegangen "Fehler wird wahrscheinlich durch zu lange dauernde Abfrage, nicht die Anführungszeichen verursacht. – Skysplit

+0

Diese Antwort als richtig zu akzeptieren macht die Frage ziemlich wertlos (nichts falsch mit der Antwort, das war meine Vermutung) –

0

Wie viele Datensätze versuchen Sie, in großen Mengen einzufügen? Können Sie es mit nur zwei versuchen? Können Sie versuchen, mehrere Masseneinfügungen (wie 100 von 100) zu machen.

Normalerweise bedeutet der Fehler Mysql has gone away, dass der Datenbankserver die Abfrage beendet hat, weil er auf zu viele Daten gewartet hat (Ihre Abfrage ist zu groß).

Sie können normalerweise einen höheren Wert auf max_allowed_packet var in my.conf setzen, damit Sie mehr Daten gleichzeitig senden können.

+0

Bitte lesen Sie meine Frage erneut –