Cách nhập tệp CSV lớn vào MySQL bằng Laravel

Trong hướng dẫn này, chúng tôi sẽ chỉ cho bạn cách nhập một số lượng lớn bản ghi từ tệp CSV vào ứng dụng Laravel bằng trình tạo cơ sở dữ liệu. Để nhập tệp CSV lớn vào MySQL bằng Laravel, chúng tôi làm theo các bước sau

  • Bước 1: Cài đặt ứng dụng Laravel
  • Bước 2: Cấu hình chi tiết cơ sở dữ liệu
  • Bước 3: Tạo Migration và Model
  • Bước 4: Tạo Trình tạo cơ sở dữ liệu
  • Bước 5: Chạy Database Seeder

Bước 1: Cài đặt ứng dụng Laravel

 Cài đặt một ứng dụng laravel mới, vì vậy hãy đến terminal, nhập lệnh và tạo một ứng dụng laravel mới.

composer create-project --prefer-dist laravel/laravel large-csv-laravel

hoặc, nếu bạn đã cài đặt Trình cài đặt Laravel dưới dạng phần phụ thuộc của nhà soạn nhạc toàn cầu:

laravel new large-csv-laravel

Bước 2: Cấu hình chi tiết cơ sở dữ liệu

Nhập thông tin đăng nhập cơ sở dữ liệu của bạn, bao gồm tên cơ sở dữ liệu, tên người dùng và mật khẩu, sau khi mở tệp .env :

DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=<DATABASE NAME>
DB_USERNAME=<DATABASE USERNAME>
DB_PASSWORD=<DATABASE PASSWORD>

Bước 3: Tạo Migration và Model

Bước tiếp theo là sử dụng thiết bị đầu cuối để chạy lệnh sau để tạo mô hình và tệp di chuyển:

php artisan make:model Product -m

thêm đoạn mã sau vào tệp di chuyển:

public function up()
{
    Schema::create('products', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->string('name');
        $table->string('description');
        $table->timestamps();
    });
}

Mở dấu nhắc lệnh và gõ lệnh sau để tạo bảng trong cơ sở dữ liệu:

php artisan migrate

Thêm đoạn mã sau vào app/Models/Product.php:

<?php
 
namespace App\Models;
 
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
 
class Product extends Model
{
    use HasFactory;
    protected $fillable = ['name', 'description'];
}

Bước 4: Tạo Trình tạo cơ sở dữ liệu

Để tạo tệp seeder để tải nhanh tệp CSV lớn vào cơ sở dữ liệu, trước tiên hãy chạy lệnh sau:

php artisan make:seeder ProductSeeder

Cập nhật mã ngay lập tức để các tệp CSV dài có thể được nhập dễ dàng bằng ứng dụng Laravel. Đoạn mã sau phải được đưa vào  database\seeders\CommunitySeeder.php tệp của bạn:

<?php

  namespace Database\Seeders;

  use Illuminate\Database\Seeder;
  use App\Models\Product;
  use Illuminate\Support\Facades\DB;
  use Illuminate\Support\LazyCollection;

  class ProductSeeder extends Seeder 
  {
  /**
  * Run the database seeds.
  *
  * @return void
  */
  public function run()
  {
    LazyCollection::make(function () {
      $handle = fopen(public_path("products.csv"), 'r');
      
      while (($line = fgetcsv($handle, 4096)) !== false) {
        $dataString = implode(", ", $line);
        $row = explode(';', $dataString);
        yield $row;
      }

      fclose($handle);
    })
    ->skip(1)
    ->chunk(1000)
    ->each(function (LazyCollection $chunk) {
      $records = $chunk->map(function ($row) {
        return [
            "name" => $row[0],
            "description" => $row[1],
        ];
      })->toArray();
      
      DB::table('products')->insert($records);
    });
  }
}

Bước 5: Chạy Database Seeder

Chạy lệnh sau để chạy Database seeder:

php artisan db:seed --class=ProductSeeder

Nhập các tệp CSV lớn trong MySQL bằng Laravel và maatwebsite/Laravel-Excel

Nếu bạn đang sử dụng Laravel Excel, bạn có thể sử dụng tính năng chunking. Sử dụng đoạn mã sau để nhập khối vào cơ sở dữ liệu thông qua Đọc khối :

Excel::filter('chunk')->load(database_path('seeds/csv/products.csv'))->chunk(250, function($results) {
    foreach ($results as $row) {
        Product::create([
            'name' => $row->name,
            'description'=>$row->description
            // other fields
        ]);
    }
});

Nếu bạn đang sử dụng lớp Nhập trong Ứng dụng Laravel của mình thông qua Laravel Excel thì bạn có thể sử dụng các phương thức sau để nhập dữ liệu vào cơ sở dữ liệu:

<?php

namespace App\Imports;

use App\Models\Product;
use Maatwebsite\Excel\Concerns\ToModel;
use Maatwebsite\Excel\Concerns\WithChunkReading;

class ProductImport implements ToModel, WithChunkReading
{
    public function model(array $row)
    {
        return new Product([
            'name' => $row[0],
            'description' => $row[1],
        ]);
    }
    
    public function chunkSize(): int
    {
        return 1000;
    }
}

Mã hóa vui vẻ !!!

1.00 GEEK