Chào các bạn, trong bài này mình sẽ hướng dẫn các bạn cách tạo dữ liệu mẫu cực nhanh bằng factory trong Laravel.
Thông thường đối với một dự án mới hoàn toàn hoặc khi cần nhiều dữ liệu phải test hệ thống, việc phải thêm một lượng lớn dữ liệu thủ công hoàn toàn hoặc viết hàm chạy vòng lặp để insert vào hệ thống đôi khi khá tốn thời gian và công sức. Ở Laravel, các bạn có thể sử dụng Factory, một lớp hỗ trợ của Model để tạo nhanh dữ liệu dùng cho mục đích nói trên, số lượng dữ liệu tạo ra một lần có thể từ vài trăm, vài nghìn dòng mà chỉ mất công khai báo một lần và một vài lệnh để tạo. Giờ không nói lan man nữa, mình sẽ bắt đầu luôn.
Tạo Factory cho Model
Đầu tiên để có thể sử dụng được factory, model của bạn phải có trait HasFactory, trong ví dụ này mình sẽ dùng model BaiViet
use Illuminate\Database\Eloquent\Factories\HasFactory;
class BaiViet extends Model
{
//bắt buộc phải có để sử dụng Factory
use HasFactory;
Tiếp theo, chúng ta sẽ tạo một class BaiVietFactory để định nghĩa các dữ liệu giả (faker) cho bài viết bằng lệnh
php artisan make:factory BaiVietFactory
Hệ thống sẽ tạo ra một class tương ứng nằm trong thư mục database\factories có tên là BaiVietFactory.
class BaiVietFactory extends Factory
{
public function definition(): array
{
return [
//
];
}
}
Lưu ý: bạn có thể dùng tên model và factory khác nhau (ví dụ BaiViet và PostFactory), hoặc thậm chí là khác namespace khác nhau (ví dụ Admin\BaiViet và Backend\PostFactory) thì sẽ cần phải cấu hình các bước sau
1/ Thêm hàm newFactory cho model
<?php
namespace App\Models\Admin;
use Database\Factories\Backend\PostFactory;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class BaiViet extends Model
{
use HasFactory;
public $table = 'blog___bai_viet';
protected static function newFactory()
{
return PostFactory::new();
}
}
2/ Thêm phần $model vào cho PostFactory
<?php
namespace Database\Factories\Backend;
use App\Models\Admin\BaiViet;
use App\Models\Model;
use Illuminate\Database\Eloquent\Factories\Factory;
class PostFactory extends Factory
{
protected $model = BaiViet::class;
public function definition(): array
{
return [];
}
}
Cấu hình các trường cho Factory để tạo dữ liệu mẫu
Để cấu hình các trường cho factory, chúng ta sẽ dùng dữ liệu tạo từ thư viện faker bằng cú pháp $this->faker, thư viện có rất nhiều kiểu dữ liệu để sử dụng, các bạn có thể tham khảo thêm tại https://fakerphp.org/, trong ví dụ này mình các cột mình dùng chủ yếu là kiểu string nên mình chỉ dùng sentence và text. Riêng id_chuyen_muc là khoá ngoại nên mình sẽ lấy ngẫu nhiên từ model ChuyenMuc
class BaiVietFactory extends Factory
{
public function definition(): array
{
return [
'tieu_de' => $this->faker->sentence(),
'noi_dung' => $this->faker->text(),
'id_chuyen_muc' => ChuyenMuc::inRandomOrder()->value('id')
];
}
}
Tạo dữ liệu mẫu với lệnh factory()->create() và artisan tinker
Để có thể tạo dữ liệu mẫu, chúng ta sẽ sử dụng lệnh factory()->create() thông qua Laravel Tinker. Tinker là một công cụ có nhiều công dụng, từ xem thử các hàm trong Model, chạy các hàm, cho tới tương tác với model, tạo bản ghi hoặc cụ thể hơn là tạo và đổi mật khẩu User luôn (khá nhiều công dụng nên mình sẽ không nói chi tiết quá), tinker được sử dụng bằng cách chạy lệnh sau
php artisan tinker
Tiếp theo chúng ta sẽ tạo 1000 bản ghi (hoặc bạn có thể cho số tuỳ ý) cho BaiViet với lệnh sau
App\Models\BaiViet::factory(1000)->create()
Kết quả sẽ hiển thị ngay trong giao diện của tinker, bạn có thể kiểm tra bằng các lệnh sau tương tự như trong controller hoặc truy cập trực tiếp vào database để kiểm tra dữ liệu trong bảng.
App\Models\BaiViet::all();
hoặc
App\Models\BaiViet::count();
Tóm lược
Qua bài này, mình đã hướng dẫn cho bạn cách để cấu hình và tạo dữ liệu mẫu cực nhanh bằng Factory, cùng với đó là cách sử dụng Laravel Tinker. Mong rằng hướng dẫn này sẽ giúp ích cho các bạn trong quá trình sử dụng Laravel để xây dựng dự án của mình.
Mình cũng có làm một video ngắn về tính năng tạo dữ liệu mẫu bằng Factory tương tự nội dung bài viết này, các bạn có thể xem thao tác bằng video để dễ hiểu hơn nha.
Hẹn gặp lại các bạn trong những bài viết tiếp theo.
Nguồn tham khảo:


Để lại một bình luận