0

PHP và MySQL Bài 38: Factory và Seeder - Tự động hóa sản xuất dữ liệu mẫu (Fake Data)

Để tạo ra dữ liệu mẫu, Laravel chia công việc làm 2 phần rõ rệt:

  • Factory (Bản thiết kế): Định nghĩa xem một dòng dữ liệu ảo (Ví dụ: 1 bài viết ảo) sẽ trông như thế nào.
  • Seeder (Máy dập): Ra lệnh cho Factory sản xuất ra bao nhiêu dòng và đẩy thẳng vào Database.

1. Tạo Factory - Bản thiết kế dữ liệu ảo

Mở Terminal và sử dụng Artisan để tạo một Factory cho Model Post:

php artisan make:factory PostFactory

Lệnh này sẽ tạo ra một file tại database/factories/PostFactory.php. Hãy mở nó ra. Bạn sẽ thấy một hàm definition().

Laravel đã tích hợp sẵn một thư viện "nói dối" cực đỉnh tên là Faker. Thư viện này có thể sinh ra tên người thật, văn bản thật, địa chỉ, email, số điện thoại ngẫu nhiên.

Sửa hàm definition() thành như sau:

<?php

namespace Database\Factories;

use Illuminate\Database\Eloquent\Factories\Factory;

class PostFactory extends Factory
{
    public function definition()
    {
        return [
            // Sinh ra một câu ngẫu nhiên làm tiêu đề
            'title' => $this->faker->sentence(), 
            
            // Sinh ra 3 đoạn văn bản ngẫu nhiên làm nội dung
            'content' => $this->faker->paragraphs(3, true), 
            
            // Random trạng thái là 'published' hoặc 'draft'
            'status' => $this->faker->randomElement(['published', 'draft']), 
        ];
    }
}

2. Chuẩn bị "Máy dập" - DatabaseSeeder

Bản thiết kế đã xong, giờ chúng ta cần một nút bấm để kích hoạt sản xuất. Laravel có sẵn một file tên là DatabaseSeeder.php nằm trong thư mục database/seeders/. Đây là trung tâm điều khiển việc sinh dữ liệu.

Mở file DatabaseSeeder.php lên và gọi Factory mà bạn vừa tạo:

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;
use App\Models\Post; // Nhớ gọi Model Post

class DatabaseSeeder extends Seeder
{
    public function run()
    {
        // Ra lệnh: Hãy dùng khuôn Post, sản xuất ra 500 bài viết và lưu vào Database
        Post::factory()->count(500)->create();
    }
}

3. Thực thi ma thuật bằng 1 dòng lệnh

Mọi thứ đã sẵn sàng. Mở Terminal lên và gõ dòng lệnh "kích nổ" này:

php artisan db:seed

Chỉ mất chưa tới 2 giây, Terminal báo thành công. Bây giờ, nếu bạn mở phpMyAdmin lên và kiểm tra bảng posts, bạn sẽ thấy 500 bài viết với tiêu đề và nội dung hoàn toàn khác nhau đã được nhét đầy vào bảng!

Mẹo thực chiến: Đôi khi cấu trúc bảng của bạn bị sai và bạn muốn xóa đi làm lại từ đầu (đập đi xây lại) kèm theo việc bơm luôn 500 dữ liệu mới này. Laravel có một lệnh gom tất cả làm một cực mạnh:

php artisan migrate:fresh --seed

Lệnh này sẽ: Xóa sạch toàn bộ các bảng trong CSDL ➔ Tạo lại các bảng từ đầu (chạy Migration) ➔ Bơm 500 dữ liệu mẫu vào (chạy Seeder).


4. Hệ quả: Website của bạn có thể vừa bị "sập"

Hãy F5 lại trình duyệt của bạn (trang http://localhost:8000/home).

Vì chúng ta dùng lệnh $posts = Post::all(); để lấy dữ liệu, lệnh all() sẽ lôi toàn bộ 500 bài viết ra và cố gắng nhét hết chúng lên một màn hình duy nhất. Nếu bạn có 1 triệu bài viết, trình duyệt của bạn sẽ treo cứng, và RAM máy chủ sẽ quá tải.

Giải pháp bắt buộc cho mọi hệ thống là Phân trang (Pagination). Cắt dữ liệu ra thành từng trang nhỏ (Ví dụ: 10 bài/trang) và có nút bấm Next / Previous.

Trong PHP thuần, việc viết logic phân trang mất khoảng 40-50 dòng code để tính toán offset, limit, số trang. Nhưng trong Laravel, nó chỉ tốn đúng... 1 từ.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí