Как импортировать данные CSV и Excel в базу данных MySQL в Laravel 8

Массовый импорт данных — полезная функция для добавления записей, хранящихся в файле, в базу данных. Данные могут храниться в формате CSV, Excel, XML, ODS и т. д.

В этом руководстве я покажу, как вы можете импортировать данные CSV и Excel в базу данных MySQL, используя пакет Laravel Excel в проекте Laravel 8.


1. Установить пакет

Требование –

  • PHP: ^7.2\|^8.0
  • Ларавель: ^5.8
  • Таблица Php: ^1.21
  • PSR/простой кэш: ^1.0
  • Расширение PHP  php_zip включено
  • Расширение PHP  php_xml включено
  • Расширение PHP  php_gd2 включено
  • Расширение PHP  php_iconv включено
  • Расширение PHP  php_simplexml включено
  • Расширение PHP  php_xmlreader включено
  • Расширение PHP  php_zlib включено

Установите пакет с помощью композитора —

composer require maatwebsite/excel

Если вы получаете сообщение об ошибке при выполнении вышеуказанной команды, выполните следующую команду:

composer require psr/simple-cache:^1.0 maatwebsite/excel

После этого снова выполнить –

composer require maatwebsite/excel

2. Обновите app.php

  • Откройте  config/app.php файл.
  • Добавьте следующее Maatwebsite\Excel\ExcelServiceProvider::class в  'providers' -
'providers' => [
      ....
      ....
      ....  
      Maatwebsite\Excel\ExcelServiceProvider::class
];
  • Добавьте следующее  'Excel' => Maatwebsite\Excel\Facades\Excel::class в  'aliases' -
'aliases' => [
     .... 
     .... 
     .... 
     'Excel' => Maatwebsite\Excel\Facades\Excel::class
];

3. Опубликовать пакет

Запустите команду -

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config

Это создаст новый excel.phpфайл в формате config/.


4. Конфигурация базы данных

Откройте .envфайл.

Укажите хост, имя базы данных, имя пользователя и пароль.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tutorial
DB_USERNAME=root
DB_PASSWORD=

5. Создать таблицу

  • Создайте новую таблицу Employeesс помощью миграции и добавьте несколько записей.
php artisan make:migration create_employees_table
  • Теперь перейдите в database/migrations/папку из корня проекта.
  • Найдите файл PHP, оканчивающийся на , create_employees_tableи откройте его.
  • Определите структуру таблицы в up()методе.
public function up()
{
    Schema::create('employees', function (Blueprint $table) {
        $table->id();
        $table->string('username');
        $table->string('name');
        $table->string('email');
        $table->smallInteger('age');
        $table->timestamps();
    });
}
  • Запустите миграцию —
php artisan migrate
  • Таблица создана.

6. Модель

  • Создать Employeesмодель.
php artisan make:model Employees
  • Откройте  app/Models/Employees.php файл.
  • Укажите массово назначаемые атрибуты модели — имя пользователя, имя, адрес электронной почты и возраст, используя $fillableсвойство.

Завершенный код

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Employees extends Model
{
    use HasFactory;

    protected $fillable = [
       'username','name','email','age'
    ];
}

7. Создайте класс импорта

Я создаю 2 класса импорта только для примера —

1. Класс EmployeesImport —

php artisan make:import EmployeesImport --model=Employees
  • Откройте  app/Imports/EmployeesImport.php файл.
  • Класс имеет 1 метод —
    • model () — считывает значения из $rowмассива и вставляет запись, если идентификатор электронной почты не существует в employeesтаблице, в противном случае возвращает значение null.

ПРИМЕЧАНИЕ. – Этот класс импорта начинает чтение записей с 1-й строки. Я объяснил, как пропустить 1-ю строку, содержащую заголовок, в следующем классе импорта.

CSV-файл без строки заголовка –

пользователь1Пользователь1 и1user1@makitweb.com28
пользователь2Пользователь2 и2user2@makitweb.com24

Завершенный код

<?php
namespace App\Imports;

use App\Models\Employees;
use Maatwebsite\Excel\Concerns\ToModel;

class EmployeesImport implements ToModel {
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row) {
 
       // Check email already exists
       $count = Employees::where('email',$row[2])->count();
       if($count > 0){
          return null;
       }
       return new Employees([
          'username' => $row[0],
          'name' => $row[1], 
          'email' => $row[2],
          'age' => $row[3],
       ]);
    }

}

2. Класс Employees2Import –

php artisan make:import Employees2Import --model=Employees
  • Откройте  app/Imports/Employees2Import.php файл.
  • Класс имеет 2 метода –
    • collection() — проверка $rowsданных массива. В случае успешной проверки вставьте запись, если идентификатор электронной почты не существует в employeesтаблице, в противном случае верните ошибку.

ПРИМЕЧАНИЕ. – Если  WithHeadingRowреализовано, то $rowsмассивы содержат заголовки строк в качестве имен ключей вместо индекса.

  • headingRow() — возвращает позицию индекса заголовка.

CSV-файл со строкой заголовка –

Имя пользователяИмяЭл. адресВозраст
ыссёгешЙогеш Сингхyogesh@makitweb.com28
бсонарикаСонарика Бхадорияbsonarika@makitweb.com28
вышалВишал Сахуvishal@makitweb.comтридцать первый

Завершенный код

<?php

namespace App\Imports;

use App\Models\Employees;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Illuminate\Support\Facades\Validator;

class Employees2Import implements ToCollection ,WithHeadingRow
{

    public function collection(Collection $rows){

       // Validate
       Validator::make($rows->toArray(), [
          '*.username' => 'required|string',
          '*.name' => 'required|string',
          '*.email' => 'required|email',
          '*.age' => 'required|integer',
       ],[
          '*.username.required'=> "The username field is required.",
          '*.username.string'=> "The username must be string.",
          '*.name.required'=> "The name field is required.",
          '*.name.string'=> "The name must be string.",
          '*.email.required'=> "The email field is required.",
          '*.email.email'=> "The email must be a valid email address.",
          '*.age.integer'=> "The age must be an integer."
       ])->validate();

       foreach ($rows as $row) {

          // Check email already exists
          $count = Employees::where('email',$row['email'])->count();
          if($count > 0){
             continue;
          }
          Employees::create([
             'username' => $row['username'],
             'name' => $row['name'], 
             'email' => $row['email'],
             'age' => $row['age'],
         ]);
       }
    }

    // Specify header row index position to skip
    public function headingRow(): int {
       return 1;
    }
}

8. Маршрут

  • Откройте  routes/web.php файл.
  • Определить 3 маршрута –
    • / —  Загрузить представление индекса.
    • employee/importdata — опубликовать маршрут для импорта данных.
    • employee/validateandimportdata — отправка маршрута для проверки и импорта данных.

Завершенный код

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\EmployeesController;

Route::get('/', [EmployeesController::class, 'index'])->name('home'); 
Route::post('employees/importdata/', [EmployeesController::class, 'importData'])->name('employees.importdata');
Route::post('employees/validateandimportdata/', [EmployeesController::class, 'validateAndImportdata'])->name('employees.validateandimportdata');

9. Контроллер

  • Создать  EmployeesController контроллер.
php artisan make:controller EmployeesController
  • Откройте  app/Http/Controllers/EmployeesController.php файл.
  • Импорт   и  . EmployeesImportEmployees2ImportExcel
  • Создайте 3 метода –
    • index() — Загрузить indexпредставление.
    • importdata() — импортировать вызов Excel::import().

Передать 2 параметра –

  1. EmployeesImportЭкземпляр класса.
  2. Передать местоположение выбранного файла 'temp'.
    • validateAndImportdata() — снова вызов Excel::import().

Передать 2 параметра –

  1. Employees2ImportЭкземпляр класса.
  2. Передайте сохраненное местоположение файла (я сохранил файл в public/employees.xlsxпапке).

Завершенный код

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Imports\EmployeesImport;
use App\Imports\Employees2Import;
use Excel;

class EmployeesController extends Controller
{
   public function index(){
      return view('index');
   }

   // Import data 
   public function importdata(Request $request){
      Excel::import(new EmployeesImport, $request->file('file')->store('temp'));
      return back()->with('success', 'Import successfully!');
   }

   // Validate and Import data 
   public function validateAndImportdata(Request $request){

      Excel::import(new Employees2Import, "employees.xlsx");
      return back()->with('success', 'Import successfully!');
   }

}

10. Просмотр

Создать  index.blade.php файл в  resources/views/ папке.

Создать 2 <form>

  • В 1-м <form >наборе действий {{ route('employees.importdata') }}. Создайте элемент файла и кнопку отправки.
  • Во 2-м <form>установите действие на {{ route('employees.validateandimportdata') }}. Создайте кнопку отправки.

Цикл $errors->all()для отображения ошибок.

Завершенный код

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <title>How to Import data into MySQL database in Laravel 8</title>

   <!-- CSS -->
   <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" >
</head>
<body>

   <div class="container mt-5">

      <!-- Success message -->
      @if(Session::has('success'))
         <div class="alert alert-success">
            {{ Session::get('success') }}
         </div>
      @endif

      <form method='post' action="{{ route('employees.importdata') }}" enctype="multipart/form-data">
         @csrf
         <div class="mb-3">
            <label for="file" class="form-label">File</label>
            <input type="file" class="form-control" id="file" name="file" value="">
         </div>

         <button type="submit" class="btn btn-success">Import</button>
      </form>

      <!-- Import data with validation -->
      <h2 class='mt-5'>Validate and import data</h2>
      {{-- Display errors --}}
      @if (count($errors) > 0)
         <div class="row">
            <div class="col-md-12 ">
                <div class="alert alert-danger">
                   <ul>
                      @foreach($errors->all() as $error)
                         <li>{{ $error }} </li>
                      @endforeach 
                   </ul> 
                </div>
            </div>
         </div>
      @endif

      <form method='post' action="{{ route('employees.validateandimportdata') }}" >
         @csrf
         <button type="submit" class="btn btn-success">Import</button>
      </form>
   </div>

</body>
</html>

11. Выход

Просмотр вывода


12. Заключение

Обязательно проверьте запись перед вставкой или обновлением записей в классе Import. Укажите WithHeadingRowв классе импорта, только если файл импорта имеет строку заголовка.

Источник: https://makitweb.com

#laravel #php #mysql 

What is GEEK

Buddha Community

Как импортировать данные CSV и Excel в базу данных MySQL в Laravel 8

Laravel 8 Import Export CSV/EXCEL File Example

In this post i will show you Laravel 8 Import Export CSV/EXCEL File Example. We will simple create import data to xls, csv file and also we will import data to database using csv file in laravel 8 application.

Using this example we can easily import-export and download the csv & excel file from the database using the maatwebsite/excel composer package. maatwebsite/excel provide easy way to import and export csv file in laravel 8 using database model.

Laravel 8 Import Export CSV/EXCEL File Example

https://websolutionstuff.com/post/laravel-8-import-export-csv-excel-file-example

#laravel 8 import export csv/excel file example #laravel 8 #import #export #csv/excel #import and export csv file in laravel 8

Как импортировать данные CSV и Excel в базу данных MySQL в Laravel 8

Массовый импорт данных — полезная функция для добавления записей, хранящихся в файле, в базу данных. Данные могут храниться в формате CSV, Excel, XML, ODS и т. д.

В этом руководстве я покажу, как вы можете импортировать данные CSV и Excel в базу данных MySQL, используя пакет Laravel Excel в проекте Laravel 8.


1. Установить пакет

Требование –

  • PHP: ^7.2\|^8.0
  • Ларавель: ^5.8
  • Таблица Php: ^1.21
  • PSR/простой кэш: ^1.0
  • Расширение PHP  php_zip включено
  • Расширение PHP  php_xml включено
  • Расширение PHP  php_gd2 включено
  • Расширение PHP  php_iconv включено
  • Расширение PHP  php_simplexml включено
  • Расширение PHP  php_xmlreader включено
  • Расширение PHP  php_zlib включено

Установите пакет с помощью композитора —

composer require maatwebsite/excel

Если вы получаете сообщение об ошибке при выполнении вышеуказанной команды, выполните следующую команду:

composer require psr/simple-cache:^1.0 maatwebsite/excel

После этого снова выполнить –

composer require maatwebsite/excel

2. Обновите app.php

  • Откройте  config/app.php файл.
  • Добавьте следующее Maatwebsite\Excel\ExcelServiceProvider::class в  'providers' -
'providers' => [
      ....
      ....
      ....  
      Maatwebsite\Excel\ExcelServiceProvider::class
];
  • Добавьте следующее  'Excel' => Maatwebsite\Excel\Facades\Excel::class в  'aliases' -
'aliases' => [
     .... 
     .... 
     .... 
     'Excel' => Maatwebsite\Excel\Facades\Excel::class
];

3. Опубликовать пакет

Запустите команду -

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config

Это создаст новый excel.phpфайл в формате config/.


4. Конфигурация базы данных

Откройте .envфайл.

Укажите хост, имя базы данных, имя пользователя и пароль.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tutorial
DB_USERNAME=root
DB_PASSWORD=

5. Создать таблицу

  • Создайте новую таблицу Employeesс помощью миграции и добавьте несколько записей.
php artisan make:migration create_employees_table
  • Теперь перейдите в database/migrations/папку из корня проекта.
  • Найдите файл PHP, оканчивающийся на , create_employees_tableи откройте его.
  • Определите структуру таблицы в up()методе.
public function up()
{
    Schema::create('employees', function (Blueprint $table) {
        $table->id();
        $table->string('username');
        $table->string('name');
        $table->string('email');
        $table->smallInteger('age');
        $table->timestamps();
    });
}
  • Запустите миграцию —
php artisan migrate
  • Таблица создана.

6. Модель

  • Создать Employeesмодель.
php artisan make:model Employees
  • Откройте  app/Models/Employees.php файл.
  • Укажите массово назначаемые атрибуты модели — имя пользователя, имя, адрес электронной почты и возраст, используя $fillableсвойство.

Завершенный код

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Employees extends Model
{
    use HasFactory;

    protected $fillable = [
       'username','name','email','age'
    ];
}

7. Создайте класс импорта

Я создаю 2 класса импорта только для примера —

1. Класс EmployeesImport —

php artisan make:import EmployeesImport --model=Employees
  • Откройте  app/Imports/EmployeesImport.php файл.
  • Класс имеет 1 метод —
    • model () — считывает значения из $rowмассива и вставляет запись, если идентификатор электронной почты не существует в employeesтаблице, в противном случае возвращает значение null.

ПРИМЕЧАНИЕ. – Этот класс импорта начинает чтение записей с 1-й строки. Я объяснил, как пропустить 1-ю строку, содержащую заголовок, в следующем классе импорта.

CSV-файл без строки заголовка –

пользователь1Пользователь1 и1user1@makitweb.com28
пользователь2Пользователь2 и2user2@makitweb.com24

Завершенный код

<?php
namespace App\Imports;

use App\Models\Employees;
use Maatwebsite\Excel\Concerns\ToModel;

class EmployeesImport implements ToModel {
    /**
    * @param array $row
    *
    * @return \Illuminate\Database\Eloquent\Model|null
    */
    public function model(array $row) {
 
       // Check email already exists
       $count = Employees::where('email',$row[2])->count();
       if($count > 0){
          return null;
       }
       return new Employees([
          'username' => $row[0],
          'name' => $row[1], 
          'email' => $row[2],
          'age' => $row[3],
       ]);
    }

}

2. Класс Employees2Import –

php artisan make:import Employees2Import --model=Employees
  • Откройте  app/Imports/Employees2Import.php файл.
  • Класс имеет 2 метода –
    • collection() — проверка $rowsданных массива. В случае успешной проверки вставьте запись, если идентификатор электронной почты не существует в employeesтаблице, в противном случае верните ошибку.

ПРИМЕЧАНИЕ. – Если  WithHeadingRowреализовано, то $rowsмассивы содержат заголовки строк в качестве имен ключей вместо индекса.

  • headingRow() — возвращает позицию индекса заголовка.

CSV-файл со строкой заголовка –

Имя пользователяИмяЭл. адресВозраст
ыссёгешЙогеш Сингхyogesh@makitweb.com28
бсонарикаСонарика Бхадорияbsonarika@makitweb.com28
вышалВишал Сахуvishal@makitweb.comтридцать первый

Завершенный код

<?php

namespace App\Imports;

use App\Models\Employees;
use Illuminate\Support\Collection;
use Maatwebsite\Excel\Concerns\ToCollection;
use Maatwebsite\Excel\Concerns\WithHeadingRow;
use Illuminate\Support\Facades\Validator;

class Employees2Import implements ToCollection ,WithHeadingRow
{

    public function collection(Collection $rows){

       // Validate
       Validator::make($rows->toArray(), [
          '*.username' => 'required|string',
          '*.name' => 'required|string',
          '*.email' => 'required|email',
          '*.age' => 'required|integer',
       ],[
          '*.username.required'=> "The username field is required.",
          '*.username.string'=> "The username must be string.",
          '*.name.required'=> "The name field is required.",
          '*.name.string'=> "The name must be string.",
          '*.email.required'=> "The email field is required.",
          '*.email.email'=> "The email must be a valid email address.",
          '*.age.integer'=> "The age must be an integer."
       ])->validate();

       foreach ($rows as $row) {

          // Check email already exists
          $count = Employees::where('email',$row['email'])->count();
          if($count > 0){
             continue;
          }
          Employees::create([
             'username' => $row['username'],
             'name' => $row['name'], 
             'email' => $row['email'],
             'age' => $row['age'],
         ]);
       }
    }

    // Specify header row index position to skip
    public function headingRow(): int {
       return 1;
    }
}

8. Маршрут

  • Откройте  routes/web.php файл.
  • Определить 3 маршрута –
    • / —  Загрузить представление индекса.
    • employee/importdata — опубликовать маршрут для импорта данных.
    • employee/validateandimportdata — отправка маршрута для проверки и импорта данных.

Завершенный код

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\EmployeesController;

Route::get('/', [EmployeesController::class, 'index'])->name('home'); 
Route::post('employees/importdata/', [EmployeesController::class, 'importData'])->name('employees.importdata');
Route::post('employees/validateandimportdata/', [EmployeesController::class, 'validateAndImportdata'])->name('employees.validateandimportdata');

9. Контроллер

  • Создать  EmployeesController контроллер.
php artisan make:controller EmployeesController
  • Откройте  app/Http/Controllers/EmployeesController.php файл.
  • Импорт   и  . EmployeesImportEmployees2ImportExcel
  • Создайте 3 метода –
    • index() — Загрузить indexпредставление.
    • importdata() — импортировать вызов Excel::import().

Передать 2 параметра –

  1. EmployeesImportЭкземпляр класса.
  2. Передать местоположение выбранного файла 'temp'.
    • validateAndImportdata() — снова вызов Excel::import().

Передать 2 параметра –

  1. Employees2ImportЭкземпляр класса.
  2. Передайте сохраненное местоположение файла (я сохранил файл в public/employees.xlsxпапке).

Завершенный код

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Imports\EmployeesImport;
use App\Imports\Employees2Import;
use Excel;

class EmployeesController extends Controller
{
   public function index(){
      return view('index');
   }

   // Import data 
   public function importdata(Request $request){
      Excel::import(new EmployeesImport, $request->file('file')->store('temp'));
      return back()->with('success', 'Import successfully!');
   }

   // Validate and Import data 
   public function validateAndImportdata(Request $request){

      Excel::import(new Employees2Import, "employees.xlsx");
      return back()->with('success', 'Import successfully!');
   }

}

10. Просмотр

Создать  index.blade.php файл в  resources/views/ папке.

Создать 2 <form>

  • В 1-м <form >наборе действий {{ route('employees.importdata') }}. Создайте элемент файла и кнопку отправки.
  • Во 2-м <form>установите действие на {{ route('employees.validateandimportdata') }}. Создайте кнопку отправки.

Цикл $errors->all()для отображения ошибок.

Завершенный код

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1">
   <title>How to Import data into MySQL database in Laravel 8</title>

   <!-- CSS -->
   <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" >
</head>
<body>

   <div class="container mt-5">

      <!-- Success message -->
      @if(Session::has('success'))
         <div class="alert alert-success">
            {{ Session::get('success') }}
         </div>
      @endif

      <form method='post' action="{{ route('employees.importdata') }}" enctype="multipart/form-data">
         @csrf
         <div class="mb-3">
            <label for="file" class="form-label">File</label>
            <input type="file" class="form-control" id="file" name="file" value="">
         </div>

         <button type="submit" class="btn btn-success">Import</button>
      </form>

      <!-- Import data with validation -->
      <h2 class='mt-5'>Validate and import data</h2>
      {{-- Display errors --}}
      @if (count($errors) > 0)
         <div class="row">
            <div class="col-md-12 ">
                <div class="alert alert-danger">
                   <ul>
                      @foreach($errors->all() as $error)
                         <li>{{ $error }} </li>
                      @endforeach 
                   </ul> 
                </div>
            </div>
         </div>
      @endif

      <form method='post' action="{{ route('employees.validateandimportdata') }}" >
         @csrf
         <button type="submit" class="btn btn-success">Import</button>
      </form>
   </div>

</body>
</html>

11. Выход

Просмотр вывода


12. Заключение

Обязательно проверьте запись перед вставкой или обновлением записей в классе Import. Укажите WithHeadingRowв классе импорта, только если файл импорта имеет строку заголовка.

Источник: https://makitweb.com

#laravel #php #mysql 

I am Developer

1617089618

Laravel 8 Tutorial for Beginners

Hello everyone! I just updated this tutorial for Laravel 8. In this tutorial, we’ll go through the basics of the Laravel framework by building a simple blogging system. Note that this tutorial is only for beginners who are interested in web development but don’t know where to start. Check it out if you are interested: Laravel Tutorial For Beginners

Laravel is a very powerful framework that follows the MVC structure. It is designed for web developers who need a simple, elegant yet powerful toolkit to build a fully-featured website.

Recommended:-Laravel Try Catch

#laravel 8 tutorial #laravel 8 tutorial crud #laravel 8 tutorial point #laravel 8 auth tutorial #laravel 8 project example #laravel 8 tutorial for beginners

I am Developer

1599536794

Laravel 8 New Features | Release Notes - Tuts Make

In this post, i will show you what’s new in laravel 8 version.

#What’s new in Laravel 8?

  • 1 - Change Path Of Default Models Directory
  • 2 - Removed Controllers Namespace Prefix
  • 3 - Enhancements on php artisan serve
  • 4 - Enhanced Rate Limiting
  • 5 - Enhanced on Route Caching
  • 6 - Update on Pagination Design
  • 8 - Dynamic Blade Componenets
  • 7 - Update Syntax for Closure Based Event Listeners
  • 8 - Queueable Model Event Listeners
  • 9 - Maintenance mode: secret access
  • 10 - Maintenance mode: pre-rendered page
  • 11 - Queued job batching
  • 12 - Queue backoff()
  • 13 - Laravel Factory

https://www.tutsmake.com/laravel-8-new-features-release-notes/

#laravel 8 features #laravel 8 release date #laravel 8 tutorial #news - laravel 8 new features #what's new in laravel 8 #laravel 8 release notes

Как экспортировать базу данных MySQL в формат CSV и Excel в Laravel 8

В Laravel вам не нужно писать длинный код для экспорта ваших данных, для этого уже есть пакет — Laravel Excel.

Это позволяет экспортировать данные в различные форматы, такие как XLSX, CSV, XLS, HTML и т. д.

В этом руководстве я покажу, как вы можете экспортировать данные базы данных MySQL в формат CSV и Excel, используя пакет Laravel Excel в Laravel 8.


1. Установить пакет

Требование –

  • PHP: ^7.2\|^8.0
  • Ларавель: ^5.8
  • Таблица Php: ^1.21
  • PSR/простой кэш: ^1.0
  • Расширение PHP  php_zip включено
  • Расширение PHP  php_xml включено
  • Расширение PHP  php_gd2 включено
  • Расширение PHP  php_iconv включено
  • Расширение PHP  php_simplexml включено
  • Расширение PHP  php_xmlreader включено
  • Расширение PHP  php_zlib включено

Установите пакет с помощью композитора —

composer require maatwebsite/excel

Если вы получаете сообщение об ошибке при выполнении вышеуказанной команды, выполните следующую команду:

composer require psr/simple-cache:^1.0 maatwebsite/excel

После этого снова выполнить –

composer require maatwebsite/excel

2. Обновите app.php

  • Откройте  config/app.php файл.
  • Добавьте следующее Maatwebsite\Excel\ExcelServiceProvider::class в  'providers' -
'providers' => [
      ....
      ....
      ....  
      Maatwebsite\Excel\ExcelServiceProvider::class
];
  • Добавьте следующее  'Excel' => Maatwebsite\Excel\Facades\Excel::class в  'aliases' -
'aliases' => [
     .... 
     .... 
     .... 
     'Excel' => Maatwebsite\Excel\Facades\Excel::class
];

3. Опубликовать пакет

Выполните команду -

php artisan vendor:publish --provider="Maatwebsite\Excel\ExcelServiceProvider" --tag=config

Это создаст новый excel.phpфайл в формате config/.


4. Конфигурация базы данных

Откройте .envфайл.

Укажите хост, имя базы данных, имя пользователя и пароль.

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=tutorial
DB_USERNAME=root
DB_PASSWORD=

5. Создать таблицу

  • Создайте новую таблицу Employeesс помощью миграции и добавьте несколько записей.
php artisan make:migration create_employees_table
  • Теперь перейдите в database/migrations/папку из корня проекта.
  • Найдите файл PHP, оканчивающийся на , create_employees_tableи откройте его.
  • Определите структуру таблицы в up()методе.
public function up()
{
    Schema::create('employees', function (Blueprint $table) {
        $table->id();
        $table->string('username');
        $table->string('name');
        $table->string('email');
        $table->smallInteger('age');
        $table->timestamps();
    });
}
  • Запустите миграцию –
php artisan migrate
  • Таблица создана и добавлены в нее записи.

6. Модель

  • Создать Employeesмодель.
php artisan make:model Employees
  • Откройте  app/Models/Employees.php файл.
  • Укажите массово назначаемые атрибуты модели — имя пользователя, имя, адрес электронной почты и возраст, используя $fillableсвойство.

Завершенный код

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Employees extends Model
{
    use HasFactory;

    protected $fillable = [
       'username','name','email','age'
    ];
}

7. Создайте класс экспорта

Я создаю 2 класса экспорта только для примера —

1. Класс EmployeesExport –

php artisan make:export EmployeesExport --model=Employees
  • Откройте  app/Exports/EmployeesExport.php файл.

Класс имеет 2 метода —

  • collection() — Загрузить экспортные данные. Здесь вы можете либо -
    • Вернуть все записи.
    • Верните определенные столбцы или измените возвращаемый ответ, что я сделал в следующем классе экспорта.
  • заголовки () — указать строку заголовка.

ПРИМЕЧАНИЕ . Удалите методы headers(), если вы не хотите добавлять строку заголовка.

Завершенный код

<?php

namespace App\Exports;

use App\Models\Employees;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;

class EmployeesExport implements FromCollection, WithHeadings
{

    /**
    * @return \Illuminate\Support\Collection
    */
    public function collection()
    {
        ## 1. Export all data
        // return Employees::all();

        ## 2. Export specific columns
        return Employees::select('id','username','name')->get();

    }

    public function headings(): array
    {
        return [
          '#',
          'Username',
          'Name'
        ];
    }
}

2. Класс EmployeesByAgeExport –

php artisan make:export EmployeesByAgeExport --model=Employees
  • Откройте  app/Exports/EmployeesByAgeExport.php файл.
  • В этом классе я добавил, __construct()чтобы разрешить отправку параметра при создании экземпляра класса и использовать его для извлечения данных.
  • После инициализации $resultмассива передать $resultдля collect()возврата -return collect($result);
  • Упомяните имена строк заголовков в heading()методе.

Завершенный код

<?php

namespace App\Exports;

use App\Models\Employees;
use Maatwebsite\Excel\Concerns\FromCollection;
use Maatwebsite\Excel\Concerns\WithHeadings;

class EmployeesByAgeExport implements FromCollection, WithHeadings
{
    private $agegreaterthan;

    public function __construct($age=0) 
    {
        $this->agegreaterthan = $age;
    }

    /**
    * @return \Illuminate\Support\Collection
    */
    public function collection()
    {
        ## 3. Conditional export and customize result
        $records = Employees::select('*')->where('age','>',$this->agegreaterthan)->get();

        $result = array();
        foreach($records as $record){
           $result[] = array(
              'id'=>$record->id,
              'username' => $record->username,
              'name' => $record->name,
              'email' => $record->email,
              'age' => $record->age,
              'status' => 1 // Custom data
           );
        }

        return collect($result);
    }

    public function headings(): array
    {
       return [
         '#',
         'Username',
         'Name',
         'Email',
         'Age',
         'Status'
       ];
    }
}

8. Маршрут

  • Откройте  routes/web.php файл.
  • Определить 4 маршрута –
    • / —  Загрузить представление индекса.
    • employee/exportcsv — Экспорт данных в формате CSV.
    • employee/exportexcel — Экспорт данных в формате Excel.
    • employee/exportbyagecsv — POST-маршрут для экспорта данных по возрасту.

Завершенный код

<?php

use Illuminate\Support\Facades\Route;
use App\Http\Controllers\EmployeesController;

Route::get('/', [EmployeesController::class, 'index'])->name('home'); 
Route::get('employees/exportcsv', [EmployeesController::class, 'exportCSV'])->name('employees.exportcsv');
Route::get('employees/exportexcel', [EmployeesController::class, 'exportExcel'])->name('employees.exportexcel');
Route::post('employees/exportbyagecsv', [EmployeesController::class, 'exportByAgeCSV'])->name('employees.exportbyagecsv');

9. Контроллер

  • Создать  EmployeesController контроллер.
php artisan make:controller EmployeesController
  • Откройте  app/Http/Controllers/EmployeesController.php файл.
  • Импорт и . EmployeesExportEmployeesByAgeExportExcel
  • Создайте 4 метода –
    • index() — Загрузить indexпредставление.
    • exportCSV() —  для вызова экспорта данных Excel::download().

Он принимает 2 параметра —

  1. Экземпляр класса.
  2. Имя файла с расширением.
$file_name = 'employees_'.date('Y_m_d_H_i_s').'.csv'; 
return Excel::download(new EmployeesExport, $file_name);
  • exportExcel() — используйте тот же код выше и измените расширение файла на .xlsx.
  • exportByAgeCSV () — считывает значение возраста POST и передает его с EmployeesByAgeExport($age)экземпляром.
$file_name = 'employees_'.date('Y_m_d_H_i_s').'.csv'; 
return Excel::download(new EmployeesByAgeExport($age), $file_name);

Завершенный код

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use App\Exports\EmployeesExport;
use App\Exports\EmployeesByAgeExport;
use Excel;

class EmployeesController extends Controller
{
    public function index(){
       return view('index');
    }

    // CSV Export
    public function exportCSV(){
       $file_name = 'employees_'.date('Y_m_d_H_i_s').'.csv';
       return Excel::download(new EmployeesExport, $file_name);
    }

    // Excel Export
    public function exportExcel(){
       $file_name = 'employees_'.date('Y_m_d_H_i_s').'.xlsx';
       return Excel::download(new EmployeesExport, $file_name);
    }

    // Conditional Export (csv)
    public function exportByAgeCSV(Request $request){

       $age = $request->age;

       $file_name = 'employees_'.date('Y_m_d_H_i_s').'.csv';
       return Excel::download(new EmployeesByAgeExport($age), $file_name);
    }
}

10. Просмотр

Создать  index.blade.php файл в  resources/views/ папке.

Создайте 2 элемента привязки –

  1. Установите hrefдля {{ route('employees.exportcsv') }}экспорта в CSV.
  2. Установите hrefдля {{ route('employees.exportexcel') }}экспорта в Excel.

Создайте <form method='post' action="{{ route('employees.exportbyagecsv') }}">. Добавьте элемент ввода для ввода возраста и кнопку отправки.

Завершенный код

<!DOCTYPE html>
<html>
<head>
   <meta charset="utf-8">
   <meta name="viewport" content="width=device-width, initial-scale=1"> 
   <title>How to Export data to CSV & Excel format in Laravel 8</title>

   <!-- CSS -->
   <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.0-beta1/dist/css/bootstrap.min.css" rel="stylesheet" >
</head>
<body>

   <div class="container mt-5">

      <a class="btn btn-primary" href="{{ route('employees.exportcsv') }}">CSV Export</a> &nbsp;&nbsp;
      <a class="btn btn-primary" href="{{ route('employees.exportexcel') }}">Excel Export</a><br><br>

      <form method='post' action="{{ route('employees.exportbyagecsv') }}">
         @csrf
         <div class="mb-3">
            <label for="age" class="form-label">Age</label>
            <input type="number" class="form-control" id="age" name="age" value="0">
         </div>

         <button type="submit" class="btn btn-success">Export</button>
      </form>
   </div>

</body>
</html>

11. Демо

Посмотреть демо


12. Заключение

Используйте конструктор в классе экспорта для обработки переданных параметров и использования его для получения данных.

В этом уроке я упомянул только 2 формата экспорта — CSV и Excel, но доступно больше форматов.

Источник: https://makitweb.com

#php #laravel #mysql