Загрузите CSV-файл и импортируйте его в базу данных с помощью Laravel

У меня есть этот метод, который загружает файл формата CSV, но теперь я хочу знать, как загрузить его в столбцы в моей базе данных.

Мой метод:

public function postUpload () { if (Input::hasFile('file')){ $file = Input::file('file'); $name = time() . '-' . $file->getClientOriginalName(); // Moves file to folder on server $file->move(public_path() . '/uploads/CSV', $name); return 'Ok'; // return for testing } } 

Поэтому мой вопрос будет в рамках этого метода, как я могу поместить его в базу данных?

этот должен работать для вас, он использует подход PDO + mySql «LOAD DATA»

 private function _import_csv($path, $filename) { $csv = $path . $filename; //ofcourse you have to modify that with proper table and field names $query = sprintf("LOAD DATA local INFILE '%s' INTO TABLE your_table FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '\"' LINES TERMINATED BY '\\n' IGNORE 0 LINES (`filed_one`, `field_two`, `field_three`)", addslashes($csv)); return DB::connection()->getpdo()->exec($query); } 

В сочетании с вашим кодом это может быть что-то вроде ниже

 public function postUpload () { if (Input::hasFile('file')){ $file = Input::file('file'); $name = time() . '-' . $file->getClientOriginalName(); //check out the edit content on bottom of my answer for details on $storage $storage = '/some/world/readible/dir'; $path = $storage . '/uploads/CSV'; // Moves file to folder on server $file->move($path, $name); // Import the moved file to DB and return OK if there were rows affected return ( $this->_import_csv($path, $name) ? 'OK' : 'No rows affected' ); } } 

РЕДАКТИРОВАТЬ

Одна вещь, которую нужно отметить, в соответствии с ошибкой, которую вы сообщаете в комментариях, которая, вероятно, связана с некоторыми разрешениями (код ошибки ОС 13: отказ от прав)

См. http://dev.mysql.com/doc/refman/5.1/en/load-data.html.

«Из соображений безопасности при чтении текстовых файлов, расположенных на сервере, файлы должны либо находиться в каталоге базы данных, либо быть читаемыми всеми. Кроме того, чтобы использовать LOAD DATA INFILE на файлах сервера, вы должны иметь привилегию FILE. См. Раздел 5.7 .3, «Привилегии, предоставляемые MySQL».

Как сообщается на mySql tracker ( http://bugs.mysql.com/bug.php?id=31670 ), кажется, что вам нужно специальное разрешение для всех папок в пути к файлу csv:

Все родительские каталоги infile нужно читать во всем мире, я думаю, а также только каталог и infile …

Итак, для infile здесь: /tmp/imports/site1/data.file

вам понадобится (я думаю, 755 работал) r + x для «other» в этих каталогах: / tmp / tmp / import

а также основные два: / tmp / import / site1 /tmp/imports/site1/data.file

Подводить итоги:
Чтобы решить, что «общая ошибка sqlstate hy000 13 не может получить stat of …», вы должны перенести загруженный файл в нужное место с соответствующими разрешениями (так что необязательно текущий, который вы используете) попробуйте что-то вроде «/ tmp /Импортировать".

В то время как информация о загрузке данных является самым быстрым способом, я предпочитаю использовать lib, например https://github.com/ddeboer/data-import, или https://github.com/goodby/csv по двум причинам.

  1. Это расширяемо, что, если ваш источник данных изменяется на файлы excel или mongo db или какой-либо другой метод?

  2. Он может быть изменен, если вам нужно преобразовать даты или строки или цифры, вы можете сделать это условно, что невозможно сделать с помощью командного процессора.

мой 2c