Duyen Hoang

Duyen Hoang

1656714120

Cách Nhập Dữ Liệu CSV & Excel Vào Cơ Sở Dữ Liệu MySQL Trong Laravel 8

Nhập hàng loạt dữ liệu là một tính năng hữu ích để thêm các bản ghi được lưu trữ trong một tệp vào cơ sở dữ liệu. Dữ liệu có thể được lưu trữ ở định dạng - CSV, Excel, XML, ODS, v.v.

Trong hướng dẫn này, tôi chỉ cách bạn có thể nhập dữ liệu CSV & Excel vào cơ sở dữ liệu MySQL bằng cách sử dụng gói Laravel Excel trong dự án Laravel 8.


1. Cài đặt gói

Yêu cầu -

  • PHP: ^7.2\|^8.0
  • Laravel: ^5.8
  • PhpS Spreadsheet: ^1.21
  • psr / simple-cache: ^1.0
  • php_zip Đã bật tiện ích mở rộng PHP 
  • php_xml Đã bật tiện ích mở rộng PHP 
  • php_gd2 Đã bật tiện ích mở rộng PHP 
  • php_iconv Đã bật tiện ích mở rộng PHP 
  • php_simplexml Đã bật tiện ích mở rộng PHP 
  • php_xmlreader Đã bật tiện ích mở rộng PHP 
  • php_zlib Đã bật tiện ích mở rộng PHP 

Cài đặt gói bằng trình soạn nhạc -

composer require maatwebsite/excel

Nếu bạn gặp lỗi khi thực hiện lệnh trên, hãy thực hiện lệnh dưới đây:

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

Sau đó, một lần nữa thực thi -

composer require maatwebsite/excel

2. Cập nhật app.php

  • Mở  config/app.php tệp.
  • Thêm phần sau Maatwebsite\Excel\ExcelServiceProvider::class vào  'providers' -
'providers' => [
      ....
      ....
      ....  
      Maatwebsite\Excel\ExcelServiceProvider::class
];
  • Thêm phần sau  'Excel' => Maatwebsite\Excel\Facades\Excel::class vào  'aliases' -
'aliases' => [
     .... 
     .... 
     .... 
     'Excel' => Maatwebsite\Excel\Facades\Excel::class
];

3. Xuất bản gói

Chạy lệnh -

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

Điều này sẽ tạo một excel.phptệp mới trong config/.


4. Cấu hình cơ sở dữ liệu

Mở .envtệp.

Chỉ định máy chủ, tên cơ sở dữ liệu, tên người dùng và mật khẩu.

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

5. Tạo bảng

  • Tạo một bảng mới Employeesbằng cách sử dụng di chuyển và thêm một số bản ghi.
php artisan make:migration create_employees_table
  • Bây giờ, điều hướng đến database/migrations/thư mục từ thư mục gốc của dự án.
  • Tìm một tệp PHP có kết thúc bằng create_employees_tablevà mở nó.
  • Xác định cấu trúc bảng trong up()phương thức.
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();
    });
}
  • Chạy quá trình di chuyển -
php artisan migrate
  • Bảng đã được tạo.

6. Mô hình

  • Tạo Employeesmô hình.
php artisan make:model Employees
  • Mở  app/Models/Employees.php tệp.
  • Chỉ định các thuộc tính Model có thể gán hàng loạt - tên người dùng, tên, email và tuổi bằng cách sử dụng thuộc $fillabletính.

Mã đã hoàn thành

<?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. Tạo lớp Nhập

Tôi đang tạo 2 lớp nhập chỉ cho mục đích ví dụ -

1. Lớp nhân viênImport -

php artisan make:import EmployeesImport --model=Employees
  • Mở  app/Imports/EmployeesImport.php tệp.
  • Lớp có 1 phương thức -
    • model () - Đọc giá trị từ $rowMảng và chèn bản ghi nếu id email không tồn tại trong employeesbảng, nếu không sẽ trả về null.

LƯU Ý - Lớp nhập này bắt đầu đọc các bản ghi từ hàng đầu tiên. Tôi đã giải thích cách bỏ qua hàng đầu tiên chứa tiêu đề trong lớp Nhập tiếp theo.

Tệp CSV không có hàng tiêu đề -

user1Người dùng1 u1user1@makitweb.com28
user2Người dùng2 u2user2@makitweb.com24

Mã đã hoàn thành

<?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. Lớp nhân viên2Import -

php artisan make:import Employees2Import --model=Employees
  • Mở  app/Imports/Employees2Import.php tệp.
  • Lớp có 2 phương thức -
    • collection () - Xác thực $rowsdữ liệu Mảng. Nếu xác thực thành công thì hãy chèn bản ghi nếu id email không tồn tại trong employeesbảng nếu không sẽ trả về lỗi.

LƯU Ý - Nếu  WithHeadingRowđược triển khai thì $rowsMảng chứa tiêu đề hàng dưới dạng tên khóa thay vì chỉ mục.

  • headerRow () - Trả về vị trí chỉ mục tiêu đề.

Tệp CSV có hàng tiêu đề -

tên tài khoảnTênE-mailTuổi tác
yssyogeshYogesh singhyogesh@makitweb.com28
bsonarikaSonarika Bhadoriabsonarika@makitweb.com28
vishalVishal Sahuvishal@makitweb.com31

Mã đã hoàn thành

<?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. Lộ trình

  • Mở  routes/web.php tệp.
  • Xác định 3 tuyến đường -
    • / -  Tải chế độ xem chỉ mục.
    • nhân viên / importdata - Đăng tuyến để Nhập dữ liệu.
    • nhân viên / validateandimportdata - Đăng tuyến để xác thực và nhập dữ liệu.

Mã đã hoàn thành

<?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. Bộ điều khiển

  • Tạo  EmployeesController Bộ điều khiển.
php artisan make:controller EmployeesController
  • Mở  app/Http/Controllers/EmployeesController.php tệp.
  • Nhập   và  . EmployeesImportEmployees2ImportExcel
  • Tạo 3 phương pháp -
    • index () - Tải indexchế độ xem.
    • importdata () - Để nhập cuộc gọi Excel::import().

Chuyển 2 tham số -

  1. EmployeesImportCá thể lớp.
  2. Vượt qua vị trí 'tạm thời' của tệp đã chọn.
    • validateAndImportdata () - Một lần nữa gọi Excel::import().

Chuyển 2 tham số -

  1. Employees2ImportCá thể lớp.
  2. Chuyển vị trí tệp được lưu trữ (Tôi đã lưu tệp trong public/employees.xlsxthư mục).

Mã đã hoàn thành

<?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. Xem

Tạo  index.blade.php tệp trong  resources/views/ thư mục.

Tạo 2 <form>-

  • Trong <form >hành động đầu tiên đặt thành {{ route('employees.importdata') }}. Tạo một phần tử tệp và một nút gửi.
  • Trong <form>hành động đặt thứ 2 thành {{ route('employees.validateandimportdata') }}. Tạo nút gửi.

Lặp $errors->all()lại để hiển thị lỗi.

Mã đã hoàn thành

<!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. Đầu ra

Xem đầu ra


12. Kết luận

Đảm bảo xác thực bản ghi trước khi chèn hoặc cập nhật bản ghi trong lớp Nhập. Chỉ định WithHeadingRowtrong lớp Nhập nếu tệp nhập có hàng tiêu đề.

Nguồn: https://makitweb.com

#laravel #php #mysql 

What is GEEK

Buddha Community

Cách Nhập Dữ Liệu CSV & Excel Vào Cơ Sở Dữ Liệu MySQL Trong Laravel 8
Duyen Hoang

Duyen Hoang

1656714120

Cách Nhập Dữ Liệu CSV & Excel Vào Cơ Sở Dữ Liệu MySQL Trong Laravel 8

Nhập hàng loạt dữ liệu là một tính năng hữu ích để thêm các bản ghi được lưu trữ trong một tệp vào cơ sở dữ liệu. Dữ liệu có thể được lưu trữ ở định dạng - CSV, Excel, XML, ODS, v.v.

Trong hướng dẫn này, tôi chỉ cách bạn có thể nhập dữ liệu CSV & Excel vào cơ sở dữ liệu MySQL bằng cách sử dụng gói Laravel Excel trong dự án Laravel 8.


1. Cài đặt gói

Yêu cầu -

  • PHP: ^7.2\|^8.0
  • Laravel: ^5.8
  • PhpS Spreadsheet: ^1.21
  • psr / simple-cache: ^1.0
  • php_zip Đã bật tiện ích mở rộng PHP 
  • php_xml Đã bật tiện ích mở rộng PHP 
  • php_gd2 Đã bật tiện ích mở rộng PHP 
  • php_iconv Đã bật tiện ích mở rộng PHP 
  • php_simplexml Đã bật tiện ích mở rộng PHP 
  • php_xmlreader Đã bật tiện ích mở rộng PHP 
  • php_zlib Đã bật tiện ích mở rộng PHP 

Cài đặt gói bằng trình soạn nhạc -

composer require maatwebsite/excel

Nếu bạn gặp lỗi khi thực hiện lệnh trên, hãy thực hiện lệnh dưới đây:

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

Sau đó, một lần nữa thực thi -

composer require maatwebsite/excel

2. Cập nhật app.php

  • Mở  config/app.php tệp.
  • Thêm phần sau Maatwebsite\Excel\ExcelServiceProvider::class vào  'providers' -
'providers' => [
      ....
      ....
      ....  
      Maatwebsite\Excel\ExcelServiceProvider::class
];
  • Thêm phần sau  'Excel' => Maatwebsite\Excel\Facades\Excel::class vào  'aliases' -
'aliases' => [
     .... 
     .... 
     .... 
     'Excel' => Maatwebsite\Excel\Facades\Excel::class
];

3. Xuất bản gói

Chạy lệnh -

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

Điều này sẽ tạo một excel.phptệp mới trong config/.


4. Cấu hình cơ sở dữ liệu

Mở .envtệp.

Chỉ định máy chủ, tên cơ sở dữ liệu, tên người dùng và mật khẩu.

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

5. Tạo bảng

  • Tạo một bảng mới Employeesbằng cách sử dụng di chuyển và thêm một số bản ghi.
php artisan make:migration create_employees_table
  • Bây giờ, điều hướng đến database/migrations/thư mục từ thư mục gốc của dự án.
  • Tìm một tệp PHP có kết thúc bằng create_employees_tablevà mở nó.
  • Xác định cấu trúc bảng trong up()phương thức.
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();
    });
}
  • Chạy quá trình di chuyển -
php artisan migrate
  • Bảng đã được tạo.

6. Mô hình

  • Tạo Employeesmô hình.
php artisan make:model Employees
  • Mở  app/Models/Employees.php tệp.
  • Chỉ định các thuộc tính Model có thể gán hàng loạt - tên người dùng, tên, email và tuổi bằng cách sử dụng thuộc $fillabletính.

Mã đã hoàn thành

<?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. Tạo lớp Nhập

Tôi đang tạo 2 lớp nhập chỉ cho mục đích ví dụ -

1. Lớp nhân viênImport -

php artisan make:import EmployeesImport --model=Employees
  • Mở  app/Imports/EmployeesImport.php tệp.
  • Lớp có 1 phương thức -
    • model () - Đọc giá trị từ $rowMảng và chèn bản ghi nếu id email không tồn tại trong employeesbảng, nếu không sẽ trả về null.

LƯU Ý - Lớp nhập này bắt đầu đọc các bản ghi từ hàng đầu tiên. Tôi đã giải thích cách bỏ qua hàng đầu tiên chứa tiêu đề trong lớp Nhập tiếp theo.

Tệp CSV không có hàng tiêu đề -

user1Người dùng1 u1user1@makitweb.com28
user2Người dùng2 u2user2@makitweb.com24

Mã đã hoàn thành

<?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. Lớp nhân viên2Import -

php artisan make:import Employees2Import --model=Employees
  • Mở  app/Imports/Employees2Import.php tệp.
  • Lớp có 2 phương thức -
    • collection () - Xác thực $rowsdữ liệu Mảng. Nếu xác thực thành công thì hãy chèn bản ghi nếu id email không tồn tại trong employeesbảng nếu không sẽ trả về lỗi.

LƯU Ý - Nếu  WithHeadingRowđược triển khai thì $rowsMảng chứa tiêu đề hàng dưới dạng tên khóa thay vì chỉ mục.

  • headerRow () - Trả về vị trí chỉ mục tiêu đề.

Tệp CSV có hàng tiêu đề -

tên tài khoảnTênE-mailTuổi tác
yssyogeshYogesh singhyogesh@makitweb.com28
bsonarikaSonarika Bhadoriabsonarika@makitweb.com28
vishalVishal Sahuvishal@makitweb.com31

Mã đã hoàn thành

<?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. Lộ trình

  • Mở  routes/web.php tệp.
  • Xác định 3 tuyến đường -
    • / -  Tải chế độ xem chỉ mục.
    • nhân viên / importdata - Đăng tuyến để Nhập dữ liệu.
    • nhân viên / validateandimportdata - Đăng tuyến để xác thực và nhập dữ liệu.

Mã đã hoàn thành

<?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. Bộ điều khiển

  • Tạo  EmployeesController Bộ điều khiển.
php artisan make:controller EmployeesController
  • Mở  app/Http/Controllers/EmployeesController.php tệp.
  • Nhập   và  . EmployeesImportEmployees2ImportExcel
  • Tạo 3 phương pháp -
    • index () - Tải indexchế độ xem.
    • importdata () - Để nhập cuộc gọi Excel::import().

Chuyển 2 tham số -

  1. EmployeesImportCá thể lớp.
  2. Vượt qua vị trí 'tạm thời' của tệp đã chọn.
    • validateAndImportdata () - Một lần nữa gọi Excel::import().

Chuyển 2 tham số -

  1. Employees2ImportCá thể lớp.
  2. Chuyển vị trí tệp được lưu trữ (Tôi đã lưu tệp trong public/employees.xlsxthư mục).

Mã đã hoàn thành

<?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. Xem

Tạo  index.blade.php tệp trong  resources/views/ thư mục.

Tạo 2 <form>-

  • Trong <form >hành động đầu tiên đặt thành {{ route('employees.importdata') }}. Tạo một phần tử tệp và một nút gửi.
  • Trong <form>hành động đặt thứ 2 thành {{ route('employees.validateandimportdata') }}. Tạo nút gửi.

Lặp $errors->all()lại để hiển thị lỗi.

Mã đã hoàn thành

<!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. Đầu ra

Xem đầu ra


12. Kết luận

Đảm bảo xác thực bản ghi trước khi chèn hoặc cập nhật bản ghi trong lớp Nhập. Chỉ định WithHeadingRowtrong lớp Nhập nếu tệp nhập có hàng tiêu đề.

Nguồn: https://makitweb.com

#laravel #php #mysql 

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

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

Thai  Son

Thai Son

1658977080

Cách Nhập Dữ Liệu Tệp CSV Vào Cơ Sở Dữ Liệu MySQL Trong CodeIgniter 4

CSV là một định dạng được sử dụng rộng rãi để trao đổi dữ liệu giữa các ứng dụng.

Cơ sở dữ liệu và kết xuất dữ liệu phải có định dạng phù hợp để nhập dữ liệu suôn sẻ và không gặp bất kỳ sự cố nào.

Trong hướng dẫn này, tôi chỉ cách bạn có thể nhập dữ liệu tệp CSV trong cơ sở dữ liệu MySQL trong dự án CodeIgniter 4.

1. Cấu hình cơ sở dữ liệu

  • Mở .envtệp có sẵn ở gốc dự án.

LƯU Ý - Nếu dấu chấm (.) Không được thêm vào đầu thì đổi tên tệp thành .env.

  • Xóa # khỏi đầu database.default.hostname, database.default.database, database.default.username, database.default.password và database.default.DBDriver.
  • Cập nhật cấu hình và lưu nó.
database.default.hostname = 127.0.0.1
database.default.database = testdb
database.default.username = root
database.default.password = 
database.default.DBDriver = MySQLi

2. Tạo bảng

  • Tạo một bảng mới usersbằng cách sử dụng di chuyển.
php spark migrate:create create_users_table
  • Bây giờ, điều hướng đến app/Database/Migrations/thư mục từ thư mục gốc của dự án.
  • Tìm một tệp PHP có kết thúc bằng create_users_tablevà mở nó.
  • Xác định cấu trúc bảng trong up()phương thức.
  • Sử dụng down()phương thức xóa usersbảng gọi khi hoàn tác di chuyển.
<?php namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class CreateUsersTable extends Migration
{
    public function up() {
       $this->forge->addField([
          'id' => [
              'type' => 'INT',
              'constraint' => 5,
              'unsigned' => true,
              'auto_increment' => true,
          ],
          'name' => [
              'type' => 'VARCHAR',
              'constraint' => '100',
          ],
          'email' => [
              'type' => 'VARCHAR',
              'constraint' => '100',
          ],
          'city' => [
              'type' => 'VARCHAR',
              'constraint' => '100',
          ],
          'status' => [
              'type' => 'INT',
              'constraint' => '2',
          ],
       ]);
       $this->forge->addKey('id', true);
       $this->forge->createTable('users');
    }

    //--------------------------------------------------------------------

    public function down() {
       $this->forge->dropTable('users');
    }
}
  • Chạy quá trình di chuyển -

php spark di chuyển


3. Cấu trúc tệp CSV

Trong ví dụ, tôi đang sử dụng cấu trúc sau:

Name, Email, City, Status
Yogesh singh, yogesh@makitweb.com, Bhopal, 1
Sonarika Bhadoria, bsonarika@makitweb.com, Delhi, 1
Ankit singh, ankitsingh@makitweb.com, Bhopal, 1

Hàng đầu tiên chứa tên trường.

LƯU Ý - Tôi đang bỏ qua hàng đầu tiên trong khi chèn bản ghi.

Trong khi nhập tệp nếu một hàng không chứa tất cả 4 trường thì tôi sẽ bỏ qua nó.

Nếu trong tệp CSV của bạn, hàng đầu tiên cũng chứa dữ liệu thì bạn chỉ cần xóa một điều kiện trong bộ điều khiển.


4. Mô hình

  • Tạo Users.phptệp trong app/Models/thư mục.
  • Mở tập tin.
  • Chỉ định tên bảng "users"trong $tablebiến, khóa chính "id"trong $primaryKey, kiểu trả "array"về $returnType.
  • Trong $allowedFieldsMảng, chỉ định tên trường - ['name', 'email','city','status']có thể được đặt trong quá trình chèn và cập nhật.

Mã đã hoàn thành

<?php 
namespace App\Models;

use CodeIgniter\Model;

class Users extends Model
{
    protected $table = 'users'; 
    protected $primaryKey = 'id';

    protected $returnType = 'array';

    protected $allowedFields = ['name', 'email','city','status'];
    protected $useTimestamps = false;

    protected $validationRules = [];
    protected $validationMessages = [];
    protected $skipValidation = false;

}

5. Lộ trình

  • Mở app/Config/Routes.phptệp.
  • Xác định 2 tuyến đường -
    • / - Hiển thị chế độ xem tải lên tệp và danh sách người dùng.
    • users / importFile - Nó được sử dụng để tải lên tệp CSV và chèn các bản ghi.

Mã đã hoàn thành

$routes->get('/', 'UsersController::index');
$routes->post('users/importFile', 'UsersController::importFile');

6. Bộ điều khiển

  • Tạo UsersController.phptệp trong app/Controllers/thư mục.
  • Mở tập tin.
  • Nhập Usersmô hình.
  • Tạo hai phương pháp -
    • index () - Chọn tất cả các bản ghi từ  usersbảng và gán cho $data['users']. Tải  users/index chế độ xem và vượt qua  $data.
    • importFile () - Phương thức này được gọi trên biểu mẫu gửi để tải tệp lên và nhập dữ liệu.

Tải lên tệp

Đặt xác thực tệp -

'file' => 'uploaded[file]|max_size[file,1024]|ext_in[file,csv],'
  1. đã tải lên -  Không thành công nếu tên của tham số không khớp với tên của bất kỳ tệp đã tải lên nào.
  2. max_size - Đặt kích thước tải lên tệp tối đa bằng KB -1024 (1 MB).
  3. ext_in - Phần mở rộng tệp hợp lệ - csv.

Nếu tệp chưa được xác thực thì hãy quay lại  users/index chế độ xem với phản hồi xác thực.

Nếu tệp hợp lệ thì hãy tải tệp lên public/csvfilevị trí.

LƯU Ý - csvfile thư mục sẽ được tạo nếu thư mục không tồn tại trong publicthư mục khi tải tệp lên.

Đọc dữ liệu tệp

Mở tệp CSV đã tải lên ở chế độ đọc.

Tôi đã chỉ định tổng số cột trong một hàng - 4 cho $numberOfFields. Sửa đổi giá trị của nó theo số cột trong tệp CSV của bạn.

Vòng lặp trên tệp và đếm tổng số phần tử trong $filedataMảng và gán nó cho $num.

Để bỏ qua hàng đầu tiên của tệp CSV, tôi đã thêm $i > 0điều kiện. Loại bỏ điều kiện này nếu tệp CSV của bạn cũng chứa dữ liệu trên hàng đầu tiên.

Nếu $num == $numberOfFieldssau đó khởi tạo $importData_arrArray. Đặt tên khóa bằng tên trường cơ sở dữ liệu MySQL.

Chèn dữ liệu

Vòng lặp trên $importData_arrMảng và kiểm tra xem email đã tồn tại trong usersbảng hay chưa. Nếu không tồn tại, hãy chèn một bản ghi mới và tăng thêm $count1.

Trả về tổng số bản ghi được chèn bằng flash SESSION.

Mã đã hoàn thành

<?php namespace App\Controllers;

use App\Models\Users;

class UsersController extends BaseController{

   public function index(){
      ## Fetch all records
      $users = new Users();
      $data['users'] = $users->findAll();

      return view('users/index',$data);
   }

   // File upload and Insert records
   public function importFile(){

      // Validation
      $input = $this->validate([
         'file' => 'uploaded[file]|max_size[file,1024]|ext_in[file,csv],'
      ]);

      if (!$input) { // Not valid
         $data['validation'] = $this->validator;

         return view('users/index',$data); 
      }else{ // Valid

         if($file = $this->request->getFile('file')) {
            if ($file->isValid() && ! $file->hasMoved()) {

               // Get random file name
               $newName = $file->getRandomName();

               // Store file in public/csvfile/ folder
               $file->move('../public/csvfile', $newName);

               // Reading file
               $file = fopen("../public/csvfile/".$newName,"r");
               $i = 0;
               $numberOfFields = 4; // Total number of fields

               $importData_arr = array();

               // Initialize $importData_arr Array
               while (($filedata = fgetcsv($file, 1000, ",")) !== FALSE) {
                  $num = count($filedata);

                  // Skip first row & check number of fields
                  if($i > 0 && $num == $numberOfFields){ 
                     
                     // Key names are the insert table field names - name, email, city, and status
                     $importData_arr[$i]['name'] = $filedata[0];
                     $importData_arr[$i]['email'] = $filedata[1];
                     $importData_arr[$i]['city'] = $filedata[2];
                     $importData_arr[$i]['status'] = $filedata[3];

                  }

                  $i++;

               }
               fclose($file);
 
               // Insert data
               $count = 0;
               foreach($importData_arr as $userdata){
                  $users = new Users();

                  // Check record
                  $checkrecord = $users->where('email',$userdata['email'])->countAllResults();

                  if($checkrecord == 0){

                     ## Insert Record
                     if($users->insert($userdata)){
                         $count++;
                     }
                  }

               }

               // Set Session
               session()->setFlashdata('message', $count.' Record inserted successfully!');
               session()->setFlashdata('alert-class', 'alert-success');

            }else{
               // Set Session
               session()->setFlashdata('message', 'File not imported.');
               session()->setFlashdata('alert-class', 'alert-danger');
            }
         }else{
            // Set Session
            session()->setFlashdata('message', 'File not imported.');
            session()->setFlashdata('alert-class', 'alert-danger');
         }

      }

      return redirect()->route('/'); 
   }
}

7. Xem

Tạo một  users  thư mục tại  app/Views/ và tạo index.phptrong usersthư mục.

Hiển thị thông báo cảnh báo bootstrap nếu  'message' tồn tại SESSION. Ngoài ra, hãy đặt lớp cảnh báo bằng  'alert-class' Session.

Tải dịch vụ xác nhận  \Config\Services::validation() và gán nó cho  $validation.

Tạo  <form method="post" action="<?=site_url('users/importFile')?>" enctype="multipart/form-data">.

Tạo một phần tử tệp và nút gửi. Hiển thị lỗi trong  <div > nếu không được xác thực.

Lặp $userslại để hiển thị danh sách người dùng trong <table >.

Mã đã hoàn thành

<!DOCTYPE html>
<html>
<head>
   <title>How to Import CSV file data to MySQL in CodeIgniter 4</title>

   <link rel="stylesheet" type="text/css" href="https://stackpath.bootstrapcdn.com/bootstrap/4.5.2/css/bootstrap.min.css">
</head>
<body>

   <div class="container">

     <div class="row">
       <div class="col-md-12">
          <?php 
          // Display Response
          if(session()->has('message')){
          ?>
             <div class="alert <?= session()->getFlashdata('alert-class') ?>">
                <?= session()->getFlashdata('message') ?>
             </div>
          <?php
          }
          ?>

          <?php $validation = \Config\Services::validation(); ?>

          <form method="post" action="<?=site_url('users/importFile')?>" enctype="multipart/form-data">

             <?= csrf_field(); ?>
             <div class="form-group">
                <label for="file">File:</label>

                <input type="file" class="form-control" id="file" name="file" />
                <!-- Error -->
                <?php if( $validation->getError('file') ) {?>
                <div class='alert alert-danger mt-2'>
                   <?= $validation->getError('file'); ?>
                </div>
                <?php }?>

             </div>

             <input type="submit" class="btn btn-success" name="submit" value="Import CSV">
          </form>
       </div>
     </div>

     <div class="row">

        <!-- Users list -->
        <div class="col-md-12 mt-4" >

           <h3 class="mb-4">Users List</h3>
           <table width="100%">
              <thead>
                 <tr>
                    <th>ID</th>
                    <th>Name</th>
                    <th>Email</th>
                    <th>City</th>
                    <th>Status</th>
                 </tr>
              </thead>
              <tbody>
                 <?php 
                 if(isset($users) && count($users) > 0){
                     foreach($users as $user){
                 ?>
                       <tr>
                          <td><?= $user['id'] ?></td>
                          <td><?= $user['name'] ?></td>
                          <td><?= $user['email'] ?></td>
                          <td><?= $user['city'] ?></td>
                          <td><?= $user['status'] ?></td>
                       </tr>
                 <?php
                     }
                 }else{
                 ?>
                     <tr>
                        <td colspan="5">No record found.</td>
                     </tr>
                 <?php
                 }
                 ?>
             </body>
           </table>
        </div>

     </div>
   </div>

</body>
</html>

8. Chạy

  • Điều hướng đến dự án bằng Command Prompt nếu bạn đang sử dụng Windows hoặc terminal nếu bạn đang sử dụng Mac hoặc Linux, và
  • Thực hiện lệnh “php spark serve”.
php spark serve
  • Chạy  http://localhost:8080 trong trình duyệt web.

9. Kết luận

Trong ví dụ này, tôi đọc từng hàng tệp CSV và kiểm tra xem tất cả các trường đều có sẵn hay không. Nếu có sẵn thì tôi đã chèn nó.

Thêm xác thực bắt buộc để tránh trùng lặp dữ liệu và trước khi chèn cũng kiểm tra xem các giá trị có ở định dạng được yêu cầu hay không.

Nguồn:  https://makitweb.com

#codeigniter #mysql #csv