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
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
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 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'];
}
Để 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);
});
}
}
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ẻ !!!