Ra mắt hai series mới cực hot Trí tuệ nhân tạo A đến ZPython công cụ không thể thiếu khi nghiên cứu Data science, Machine learning.

Todo List: Nhập dữ liệu mẫu với Factory và Seeding

Video trong bài viết

Chúng ta đã tạo ra bảng todos trong database todos_app, một công việc rất nhàm chán tiếp theo là tạo ra dữ liệu mẫu nếu sử dụng cách thức tạo dữ liệu thủ công bằng tay. Với Laravel, mọi thứ đã được lường trước, do vậy đã có Laravel Factory và Laravel Seeder xử lý cho bạn.

Laravel Factory

Khi phát triển ứng dụng hoặc kiểm thử ứng dụng, chúng ta cần vài bản ghi có sẵn trong các bảng, Laravel Factory cho phép định nghĩa một tập các trường của một Model để có thể tạo ra hàng loạt các model.

Sử dụng câu lệnh artisan tạo ra file factory:

C:\laragon\www\todo-app
λ php artisan make:factory TodoFactory
Factory created successfully.

Một file TodoFactory.php được tạo ra trong thư mục database/factories.

<?php

/* @var $factory \Illuminate\Database\Eloquent\Factory */

use App\Model;
use Faker\Generator as Faker;

$factory->define(Model::class, function (Faker $faker) {
    return [
        //
    ];
});

Đây là khung của một Factory, chúng ta thay đổi nội dung để có một Factory dùng trong việc tạo ra dữ liệu mẫu cho Todo.

<?php

/* @var $factory \Illuminate\Database\Eloquent\Factory */

use App\Model;
use Faker\Generator as Faker;

$factory->define(\App\Todo::class, function (Faker $faker) {
    return [
        'name'        => $faker->sentence(3),
        'description' => $faker->paragraph(4),
        'completed'   => false 
    ];
});

Trong đoạn code này chúng ta có mấy điểm cần lưu ý như sau:

  • Faker là package chuyên dùng để tạo dữ liệu mẫu, nó có thể tạo ra các loại dữ liệu khác nhau từ chuỗi ký tự, văn bản, số cho đến hình ảnh, số điện thoại, địa chỉ...
  • Chúng ta định nghĩa các trường của model Todo như sau:
    • name: làm một câu với 3 từ
    • description: là một đoạn văn bản có 4 câu
    • completed: mặc định là false.

Như vậy chúng ta đã tạo ra một Factory là một bộ khung để có thể sản xuất hàng loạt Model Todo mẫu. Phần tiếp theo chúng ta đưa bộ khung này vào hệ thống và thực hiện tạo ra hàng loạt sản phẩm là Todo.

Laravel Seeder

Tạo Seeder bằng câu lệnh php artisan make:seed như sau:

C:\laragon\www\todo-app
λ php artisan make:seed TodosSeeder
Seeder created successfully.

Chúng ta có file TodosSeeder.php trong thư mục database/seeds. Trong phần Factory, chúng ta đã tạo ra một khung sản phẩm mẫu cho Todo và giờ chúng ta sử dụng khung mẫu này để tạo ra sản phẩm, viết code cho TodosSeeder.php:

<?php

use Illuminate\Database\Seeder;

class TodosSeeder extends Seeder
{
    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        factory(App\Todo::class, 10)->create();
    }
}

Trong này chúng ta thông báo sẽ tạo ra 10 sản phẩm từ khung mẫu App\Todo::class ở trong Factory ở trên.

Sau đó, chúng ta cần khai báo việc sản xuất này vào file database/seeds/DatabaseSeeder.php như sau:

<?php

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{
    /**
     * Seed the application's database.
     *
     * @return void
     */
    public function run()
    {
        $this->call(TodosSeeder::class);
    }
}

Tại sao vậy, tưởng tượng đây là một nhà máy lớn có thể sản xuất ra nhiều sản phẩm Todo, User... Mỗi bộ phận máy móc cụ thể như TodosSeeder, UsersSeeder sẽ sử dụng các khuôn mẫu riêng tương ứng là TodoFactory, UserFactory. Các bộ phận máy móc này cần đăng ký với nhà máy là DatabaseSeeder.php và khi thực hiện một lệnh là tạo ra hàng loạt sản phẩm Todo, User...

Mọi thứ đã chuẩn bị xong, giờ là lúc ra lệnh cho nhà máy sản xuất các sản phẩm mẫu với câu lệnh php artisan db:seed

C:\laragon\www\todo-app
λ php artisan db:seed
Seeding: TodosSeeder
Database seeding completed successfully.

Mở database todos_app ra chúng ta sẽ thấy bảng todos đã có 10 bản ghi dữ liệu mẫu.

Dữ liệu mẫu Todo

Tạo dữ liệu mẫu với Faker

Package Faker chúng ta sử dụng ở trên là một gói phần mềm mà Laravel đã tích hợp sẵn vào dự án mặc định khi cài đặt là đã có. Qua ví dụ ở trên, bạn cũng đã biết cơ bản về Faker, tuy nhiên tôi muốn giới thiệu thêm về nó về package này đã có những tùy chọn cho phép sinh ra cả dữ liệu mẫu tiếng Việt. Trong TodoFactory.php chúng ta có thể thêm vào faker tiếng Việt như sau:

<?php

/* @var $factory \Illuminate\Database\Eloquent\Factory */

use App\Model;
use Faker\Generator as Faker;

$fakerVN = \Faker\Factory::create('vi_VN');
$factory->define(\App\Todo::class, function (Faker $faker) use ($fakerVN) {
    return [
        'name'        => $fakerVN->sentence(3),
        'description' => $fakerVN->paragraph(4),
        'completed'   => false 
    ];
});

Thực hiện lệnh php artisan db:seed, chúng ta có thêm 10 bản ghi nữa trong bảng todos, nhưng không thấy dữ liệu ở dạng tiếng Việt đâu cả, đó là do Faker chỉ có dữ liệu vùng miền ở một số loại sau: họ tên, số điện thoại, địa chỉ, màu sắc... Thôi tạm biết thế đã, đến lúc dùng đến các loại dữ liệu này thì tính sau.

Nếu bạn không muốn sử dụng nhiều faker với các vùng miền khác nhau mà muốn thiết lập bất cứ khi chạy Faker là lấy theo thiết lập vùng miền của ứng dụng thì có thể cài đặt trực tiếp vào config/app.php:

'faker_locale' => 'vi_VN',

Như vậy, trong ứng dụng bất kỳ lúc nào dùng đến Faker là nó tự tham chiếu đến vùng miền Việt Nam vi_VN. Nếu bạn quan tâm có thể tham khảo trực tiếp trong tài liệu Faker trên Github.

Kết luận

Sau bài học hôm nay, chúng ta đã biết cách sử dụng Laravel Factory, Laravel Seeder để tạo ra dữ liệu mẫu tự động. Đây là những kiến thức hết sức quan trọng khi các bạn làm việc với các dự án thực tế, ví dụ để kiểm tra hiệu năng một hệ thống xử lý nghiệp vụ hoặc tìm kiếm, cần tạo ra hàng triệu bản ghi mẫu, nếu làm thủ công thực sự là không tưởng, với Factory và Seeder, công việc này quá đơn giản phải không?

Code: Bài 6 - Laravel Factory, Seeder tạo dữ liệu mẫu

Các bước thực hiện để start dự án:

  • Tải và giải nén
  • Composer update
  • php artisan migrate
  • php artisan db:seed
  • php artisan serve

CÁC BÀI VIẾT KHÁC

FirebirD

Đam mê Toán học, Lập trình. Sở thích chia sẻ kiến thức, Phim hài, Bóng đá, Cà phê sáng với bạn bè.

Todo List: Thiết lập kết nối CSDL và tạo bảng với Laravel Migration

Todo List: Giới thiệu mô hình MVC trong Laravel

0 Bình luận trong "Todo List: Nhập dữ liệu mẫu với Factory và Seeding"

Thêm bình luận