2016-12-07 4 views
0

Я написал функцию в контроллере, используемом в Laravel Framework. Функция получает путь к файлу * .csv, а затем вставляет все элементы этого * .csv-файла с помощью инструкции raw bulk insert в базу данных. Проблема в том, что элементы не помещаются в таблицу базы данных при выполнении функции. У меня тоже нет ошибок. Когда я выполняю запрос в SQL Server Manager, он вставляет элементы без проблем. Что я делаю неправильно, и есть ли лучший способ для массового ввода элементов csv-файла в базу данных?Laravel Raw Bulk insert

Вот код для функции:

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

С наилучшими пожеланиями, Ялчин

ответ

0

Мне нравится использовать в laravel-excel библиотеку для работы с моими файлами CSV, это делает его немного легче управлять чувствует себя более «laravel-y» для меня.

laravel/excel lbirary: http://www.maatwebsite.nl/laravel-excel/docs/getting-started#installation библиотека.

Что вы тогда сделать несколько просто:

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

Примечания:

  • Использование chunk гарантирует, что мы не исчерпали памяти.
  • Методы getFillable() предполагают, что вы определили protected $fillable = []; свойства на вашей модели TestTable.
  • column names от testTable соответствует column names от вашего csvfile.

Надеюсь, это поможет вам.

+0

Это было бы хорошим решением, но я забыл сказать, что csv может содержать до 1.000.000 строк с большим количеством столбцов. Я уже пробовал это с PHPExcel, и он очень медленный (около 10 минут для работы вставки). Ваше решение понадобилось около 7 минут. Его все еще слишком много. С BULK INSERT в SQL требуется около 1 мин. Так что ваше решение не то, что я ищу, но спасибо в любом случае :). – Yasemin