Поэтому я полный Noob для Laravel и здесь что-то пытаюсь. Я хочу импортировать CSV-файл в две таблицы, у меня есть таблица, называемая списками, которая получит имя списка и client_id
.
Затем у меня есть таблица, называемая клиентами, которая получит контактный номер имени фамилии, а также client_id
и list_id
.
Я хочу, чтобы импортировать CSV-файл, который возьмет имя файла и сохранит его в таблице списка, а затем создаст массив через файл CSV и импортирует данные в таблицу Customers со списком и идентификаторами клиента.
У меня есть первая часть, и она правильно вставляется в таблицу списков. Как мне теперь создать массив из CSV, который находится в хранилище / документы, а затем вставить его в таблицу клиентов?
namespace App\Http\Controllers; use Input; use DB; use Illuminate\Http\Request; use App\Http\Requests\ListsRequest; use App\Lists; use App\Clients; use App\Http\Requests; use App\Http\Controllers\Controller; class ListsController extends Controller { public function index() { // $list_items = Lists::all(); $clients = Clients::all(); return view('lists.show', compact('clients')); } public function store(Requests\ListsRequest $request) { $input = $request->input(); Lists::create($input); if (Input::hasFile('name')) { $file = Input::file('name'); $name = time() . '-' . $file->getClientOriginalName(); $path = storage_path('documents'); $file->move($path, $name); // All works up to here // All I need now is to create an array // from the CSV and insert into the customers database } } }
Я решил использовать ответ, который принял, но я также сыграл с другим ответом и заставил его работать так.
public function store(Requests\ListsRequest $request) { $input = $request->input(); $client_id = $request->input('client_id'); if (Input::hasFile('name')) { $file = Input::file('name'); $name = time() . '-' . $file->getClientOriginalName(); $path = storage_path('documents'); Lists::create(['client_id' => $client_id, 'name' => $name]); $reader = Reader::createFromPath($file->getRealPath()); // Create a customer from each row in the CSV file $headers = array(); foreach ($reader as $index => $row) { if ($index === 0) { $headers = $row; } else { $data = array_combine($headers, $row); Customers::create($data); } } $file->move($path, $name); return view('clients'); } }
Есть 3 шага, чтобы прочитать CSV-файл и импортировать его в базу данных в Laravel.
Прежде чем начать, я создал образец файла test.csv
и поместил его в свою test.csv
папку в папке с файлами:
name,email,password user1,email1@email.com,pasxxxxxxxxxword user2,email2@email.com,pasxxxxxxxxxword user3,email3@email.com,pasxxxxxxxxxword
Шаг 1 и 2; Я создал вспомогательную функцию csvToArray
, на которую я просто поместил ее в свой контроллер (эта функция вдохновлена этой ссылкой ), она просто считывает CSV-файл и преобразует его в массив:
function csvToArray($filename = '', $delimiter = ',') { if (!file_exists($filename) || !is_readable($filename)) return false; $header = null; $data = array(); if (($handle = fopen($filename, 'r')) !== false) { while (($row = fgetcsv($handle, 1000, $delimiter)) !== false) { if (!$header) $header = $row; else $data[] = array_combine($header, $row); } fclose($handle); } return $data; }
Шаг 3; И вот мой последний шаг, прочитайте массив и вставьте его в нашу базу данных:
public function importCsv() { $file = public_path('file/test.csv'); $customerArr = $this->csvToArray($file); for ($i = 0; $i < count($customerArr); $i ++) { User::firstOrCreate($customerArr[$i]); } return 'Jobi done or what ever'; }
Примечание. Это решение предполагает, что у вас есть модель в вашем проекте Laravel, и у вас есть правильная таблица в вашей базе данных.
если вы используете dd($customerArr)
вы получите это
В вашем методе store()
создайте запись в таблице lists
, а затем перейдите по содержимому файла CSV и вставьте данные в таблицу Customers. Вы должны создать связь между клиентами и списками для этой цели. Вам также было бы лучше использовать что-то вроде CSV-пакета PHP League для чтения таких файлов:
public function store(AddCustomersRequest $request) { // Get uploaded CSV file $file = $request->file('csv'); // Create list name $name = time().'-'.$file->getClientOriginalName(); // Create a list record in the database $list = List::create(['name' => $name]); // Create a CSV reader instance $reader = Reader::createFromFileObject($file->openFile()); // Create a customer from each row in the CSV file foreach ($reader as $index => $row) { $list->customers()->create($row); } // Redirect back to where you need with a success message }