Intereting Posts
лучший алгоритм хранения паролей в 2016 году Как сфокусировать верхний заголовок Аккордеона, когда мы нажимаем на это Уведомление Apple Push с отправкой пользовательских данных Как определить, является ли выбранное изображение для загрузки допустимым? Мой сайт php был взломан кодами, загруженными как изображение ..? Проверьте, сохранен ли IP-адрес в базе данных JS vs PHP: приоритет оператора присваивания при использовании с логическими или WordPress, как установить длину выдержки сообщения до 100 символов и 200 символов Ответ не содержит данных при регистрации и регистрации Android Почему функция как элемент массива в php-классе не работает Paypal переводит деньги с одной учетной записи на другую Загрузка изображений в TileList из Mysql с использованием PHP и XML на Flash CS5 Изменение цвета и вывода журнала ошибок php MAMP в терминале Замените атрибуты изображения для плагина lazyload на элементах изображения с определенным классом pecl install cassandra throws: "error: Не удалось загрузить libcassandra" в OS X

Импортируйте CSV-файл в контроллер Laravel и вставьте данные в две таблицы

Поэтому я полный 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'); } } 

Related of "Импортируйте CSV-файл в контроллер Laravel и вставьте данные в две таблицы"

Есть 3 шага, чтобы прочитать CSV-файл и импортировать его в базу данных в Laravel.

  1. Чтение файла CSV
  2. Преобразовать его в массив
  3. Наконец, создайте записи в нашей базе данных.

Прежде чем начать, я создал образец файла 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 }