2016-12-07 2 views
0

Ich schrieb eine Funktion in einem Controller im Laravel Framework verwendet. Die Funktion ruft den Dateipfad einer * .csv-Datei ab und fügt dann alle Elemente dieser * .csv-Datei mit einer Raw-Bulk-Insert-Anweisung in die Datenbank ein. Das Problem besteht darin, dass die Elemente bei der Ausführung der Funktion nicht in die Datenbanktabelle übernommen werden. Ich bekomme auch keine Fehler. Wenn ich die Abfrage in SQL Server Manager ausführe, fügt es die Elemente ohne Probleme ein. Was mache ich falsch und gibt es eine bessere Möglichkeit, die Elemente einer CSV-Datei in die Datenbank einzufügen?Laravel Raw Bulk einfügen

Hier ist der Code für die Funktion ist:

 public static function bulkInsertCSV($filePath){ 

      $sql = "use [testDatabase] BULK INSERT [dbo].[testTable] 
        FROM '" . $filePath . "' WITH (FIELDTERMINATOR = ';'," 
        . "ROWTERMINATOR = '\\n');"; 
      //DB::statement($sql); 
      DB::statement(DB::raw($sql)); 
     } 

Mit freundlichen Grüßen, Yalcin

Antwort

0

ich mit meiner CSV-Dateien für den Umgang der laravel-excel Bibliothek mag mit, es macht es etwas einfacher zu verwalten und fühlt sich mehr "Laravel-y" zu mir.

Die laravel/excel Bibliothek: http://www.maatwebsite.nl/laravel-excel/docs/getting-started#installation Bibliothek.

Was würden Sie dann tun, ist etwas einfach:

Excel::filter('chunk')->load($filePath)->chunk(500, function($rows){ 
    foreach($rows as $row) { 
     $data = collect([]); 
     foreach(App\TestTable::getFillable() as $fillable) { 
      if (isset($row[$fillable])) { 
       $data->put($fillable, $row[$fillable]); 
      } 
     } 

     App\TestTable::create($data->toArray()); 
    } 
}); 

Hinweise:

  • Mit chunk garantiert, dass wir nicht über genügend Arbeitsspeicher ausgeführt.
  • Die getFillable() Methode geht davon aus, dass Sie die protected $fillable = []; Eigenschaften auf Ihrem TestTable Modell definiert haben.
  • Die column names von Ihrer testTable entsprechen der column names von Ihrer csvfile.

Hoffentlich hilft das Ihnen.

+0

Dies wäre eine gute Lösung, aber ich habe vergessen zu sagen, dass die CSV bis zu 1.000.000 Zeilen mit vielen Spalten enthalten kann. Ich habe es bereits mit PHPExcel probiert und es ist wirklich langsam (ca. 10 Minuten für den Insert-Betrieb). Ihre Lösung benötigt ca. 7 Minuten. Es ist immer noch zu viel. Mit BULK INSERT in SQL dauert es ca. 1 min. Ihre Lösung ist nicht die, nach der ich suche, aber trotzdem danke :). – Yasemin