LaraCSV tạo file CSV từ Eloquent Model

CSV viết tắt của comma-separated values là một dạng file văn bản lưu trữ dữ liệu dạng bảng với nội dung thuần văn bản. Mỗi dòng trong file là một bản ghi, mỗi dòng chứa nhiều cột phân cách nhau bởi dấu phẩy (commas). File .csv có thể đọc được bởi ứng dụng Microsoft Excel và có thể thực hiện các tính toán, định dạng và chuyển sang file .xls hoặc .xlsx của Excel.

Các ứng dụng có hiển thị dữ liệu dạng bảng với lượng dữ liệu lớn thường có chức năng lưu dữ liệu dưới dạng CSV. Người dùng có lưu lại file CSV và sau đó thao tác dữ liệu trong đó thông qua Microsoft Excel. LaraCSV là một gói thư viên giúp bạn chuyển đổi dễ dang các truy vấn bằng Eloquent Model thành file CSV.

Mô hình LaraCSV

1. Cài đặt LaraCSV

Cài đặt LaraCSV được thực hiện thông qua Composer bằng câu lệnh:

Admin@ADMIN-PC c:\xampp\htdocs\allaravel.com
$ composer require "usmanhalalit/laracsv:1.*@dev"
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 2 installs, 0 updates, 0 removals
  - Installing league/csv (8.2.1): Downloading (100%)
  - Installing usmanhalalit/laracsv (1.x-dev f0c5e57): Cloning f0c5e57364 from cache
Writing lock file
Generating optimized autoload files
> Illuminate\Foundation\ComposerScripts::postUpdate
> php artisan optimize
Generating optimized class loader
The compiled services file has been removed.

2. Sử dụng LaraCSV

2.1 Xây dựng và tải file csv

Để sử dụng LaraCSV việc đầu tiên là tạo một instance của Laracsv\Export, LaraCSV sử dụng phương thức build() với hai tham số để xây dựng file CSV:

Ví dụ tạo ra file CSV từ truy vấn lấy tất cả user có email từ allaravel.com.

$allaravelUsers = User::where('email', 'like', '%@allaravel.com')->get();
$csvExporter = new \Laracsv\Export();
$csvExporter->build($allaravelUsers, ['name', 'email']);

Như vậy $csvExporter đã xây dựng file csv và lưu trong các thư mục tạm trong hệ thống, muốn tải file này về bằng trình duyệt sử dụng phương thức download(). Phương thức này nếu không truyền tham số sẽ trả về một file với tên file chứa date time.

$csvExporter->download();
// Tải về file với tên dạng 2017-07-04_060445.csv

Nếu bạn muốn đặt tên cho file tải về, bạn có thể truyền một biến chứa tên file vào phương thức download():

$csvExporter->download('user_list.csv');

2.2 Các định dạng khác

LaraCSV sử dụng League CSV, do đó mọi định dạng mà League CSV xử lý được thì LaraCSV cũng thực hiện được. Đầu tiên, tạo League CSV instance bằng:

$csv = $csvExporter->getCsv();

sau đó bạn có thể gọi các phương thức từ League CSV instance này:

// Hiển thị CSV như một bảng HTML
$csv->toHTML();
// Hiển thị CSV như một mảng
$csv->jsonSerialize()();
// Hiển thị CSV như một chuỗi
$csv = (string) $csv;
// In CSV ra màn hình
echo $csv;

2.3 Chỉnh sửa header file CSV

Như ở trên đã nêu, phương thức build() có hai tham số, tham số thứ hai định nghĩa tên cho các cột dữ liệu trong file CSV, các tên này chính là các trường trong database, tuy nhiên bạn có thể chỉnh sửa các tên này tùy ý:

$csvExporter->build(User::get(), ['email', 'name' => 'Full Name', 'created_at' => 'Joined']);

Ví dụ trường name trong database sẽ được hiển thị thành cột Full Name trong file CSV.

2.4 Thay đổi và thêm cột dữ liệu trong file CSV

LaraCSV cũng cho phép bạn thêm các cột dữ liệu hoặc thay đổi các cột dữ liệu trước khi build file CSV với phương thức beforeEach():

$csvExporter = new \Laracsv\Export();
$users = User::get();

$csvExporter->beforeEach(function ($user) {
    // Thay đổi định dạng trường created_at khi hiển thị trong cột dữ liệu
    $user->created_at = date('f', strtotime($user->created_at));
    // Thêm cột ghi chú trong file CSV
    $user->notes = 'Ghi chú cho người dùng: ' . $user->name; 
});

$csvExporter->build($users, ['email' => 'Địa chỉ email', 'name' => 'Họ và tên', 'created_at' => 'Ngày tham gia', 'notes' => 'Ghi chú']);

2.5 Xử lý mối quan hệ trong Eloquent Model

Khi các Eloquent Model có mối quan hệ với nhau, có thể bạn muốn có thêm các các cột chứa dữ liệu của quan hệ này. Ví dụ Model Product và Category có mối quan hệ 1-1 khi đó, ngoài thông tin về product chúng ta muốn lấy thêm tên category chẳng hạn:

// eager load
$products = Products::with('category')->get();
$csvExporter->build($products, ['Danh mục', 'category.title']);

3. Lời kết

LaraCSV là package khá hữu dụng khi bạn muốn cung cấp cho người dùng file dữ liệu dạng CSV. Có nhiều các package cho Laravel khác có nhiều tính năng hơn khi làm việc với Microsoft Excel, tuy nhiên nếu bạn chỉ cần file dữ liệu dạng bảng đơn giản thì LaraCSV là rất hợp lý. LaraCSV mới hoạt động ở một chiều, tức là từ database thông qua Eloquent Model xuất ra file CSV nhưng chưa có chiều ngược lại là tải dữ liệu file CSV vào database, tính năng này rất cần thiết cho những trường hợp muốn nhập liệu hàng loạt bằng Excel, ví dụ như nhập liệu sản phẩm trong một website thương mại điện tử. Hi vọng, LaraCSV sẽ có những cải tiến thêm trong thời gian tới.

One thought on “LaraCSV tạo file CSV từ Eloquent Model

Add Comment