Laravel Seeder là công cụ giúp tự động thêm dữ liệu vào cơ sở dữ liệu thay vì phải nhập từng bản ghi thủ công. Seeder đặc biệt hữu ích khi xây dựng project mới, tạo dữ liệu phục vụ phát triển, kiểm thử hoặc thiết lập các dữ liệu mặc định cho ứng dụng. Seeder thường được sử dụng kết hợp với Migration, Model, Factory và Faker để hình thành quy trình khởi tạo database hoàn chỉnh.
Laravel Seeder là gì?
Laravel Seeder là cơ chế cho phép định nghĩa dữ liệu và đưa dữ liệu đó vào database thông qua code. Ví dụ, ứng dụng cần một tài khoản quản trị mặc định. Thay vì tự thêm tài khoản bằng công cụ quản lý database, bạn có thể tạo Seeder:
php artisan make:seeder UserSeeder
Laravel sẽ tạo file Seeder trong:
database/seeders/
Sau đó có thể thêm dữ liệu:
<?php
namespace Database\Seeders;
use App\Models\User;
use Illuminate\Database\Seeder;
class UserSeeder extends Seeder
{
public function run(): void
{
User::create([
‘name’ => ‘Admin’,
’email’ => ‘admin@example.com’,
‘password’ => bcrypt(‘password’),
]);
}
}
Chạy Seeder bằng: php artisan db:seed –class=UserSeeder
Laravel sẽ thực thi phương thức run() và tạo bản ghi tương ứng trong database.

Seeder dùng để làm gì?
Seeder có nhiều ứng dụng trong quá trình phát triển Laravel.
Tạo dữ liệu mặc định
Seeder có thể tạo những dữ liệu mà ứng dụng cần ngay từ đầu như:
- Tài khoản quản trị.
- Danh mục mặc định.
- Role.
- Permission.
- Cấu hình hệ thống.
Tạo dữ liệu phục vụ phát triển
Khi xây dựng giao diện hoặc chức năng, developer thường cần database có sẵn dữ liệu để kiểm tra. Seeder giúp tạo lại dữ liệu nhanh chóng sau mỗi lần reset database.
Tạo dữ liệu kiểm thử
Seeder có thể chuẩn bị những bản ghi cần thiết trước khi kiểm tra một tính năng.
Đồng bộ môi trường phát triển
Thay vì mỗi thành viên trong team tự nhập dữ liệu khác nhau, Seeder giúp mọi người có thể tạo cùng một bộ dữ liệu theo code đã được quản lý trong project.
Tạo Seeder bằng Artisan
Laravel cung cấp Artisan command:
php artisan make:seeder ProductSeeder
Sau khi chạy, file sẽ nằm tại:
database/seeders/ProductSeeder.php
Một Seeder cơ bản:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class ProductSeeder extends Seeder
{
public function run(): void
{
//
}
}
Logic tạo dữ liệu được đặt trong phương thức run().
Thêm dữ liệu bằng Seeder
Có thể sử dụng Eloquent Model:
use App\Models\Product;
Product::create([
‘name’ => ‘Laravel Course’,
‘price’ => 500000,
]);
Hoặc sử dụng Query Builder:
use Illuminate\Support\Facades\DB;
DB::table(‘products’)->insert([
‘name’ => ‘Laravel Course’,
‘price’ => 500000,
]);
Nếu cần thêm nhiều bản ghi:
DB::table(‘products’)->insert([
[
‘name’ => ‘Laravel Course’,
‘price’ => 500000,
],
[
‘name’ => ‘PHP Course’,
‘price’ => 400000,
],
]);
Việc lựa chọn Model hay Query Builder phụ thuộc vào cách dữ liệu được tổ chức và logic mà project cần thực hiện.
Chạy một Seeder cụ thể
Để chạy riêng ProductSeeder: php artisan db:seed –class=ProductSeeder
Cách này phù hợp khi chỉ muốn tạo một nhóm dữ liệu nhất định. Nếu project có nhiều Seeder, nên quản lý chúng thông qua DatabaseSeeder.
DatabaseSeeder là gì?
Laravel cung cấp file:
database/seeders/DatabaseSeeder.php
Đây có thể được xem là Seeder chính để gọi các Seeder khác.
Ví dụ:
public function run(): void
{
$this->call([
UserSeeder::class,
CategorySeeder::class,
ProductSeeder::class,
]);
}
Sau đó chỉ cần chạy:
php artisan db:seed
Laravel sẽ thực thi các Seeder được khai báo.
Cách tổ chức này giúp project có nhiều nhóm dữ liệu nhưng vẫn dễ quản lý thay vì viết tất cả vào một file.
Kết hợp Factory với Seeder
Khi cần tạo hàng chục, hàng trăm hoặc hàng nghìn bản ghi, việc viết từng dữ liệu trong Seeder sẽ không hiệu quả. Đây là lúc Factory phát huy tác dụng.
Ví dụ:
use App\Models\User;
User::factory()->count(50)->create();
Đoạn code trên yêu cầu Factory tạo 50 User.
Factory thường kết hợp với Faker để sinh dữ liệu như:
- Tên.
- Email.
- Địa chỉ.
- Số điện thoại.
- Nội dung.
- Ngày tháng.
Trong quy trình này, Học Laravel sẽ giúp bạn có nền tảng để hiểu cách Seeder kết nối với Eloquent Model, Factory và những thành phần khác thay vì chỉ sử dụng từng lệnh một cách rời rạc.
Seeder và Migration khác nhau thế nào?
Seeder và Migration đều liên quan đến database nhưng có nhiệm vụ khác nhau.
| Thành phần | Nhiệm vụ |
| Migration | Tạo và thay đổi cấu trúc database |
| Seeder | Thêm dữ liệu vào database |
| Factory | Định nghĩa cách tạo dữ liệu mẫu |
| Faker | Sinh dữ liệu giả |
Có thể hình dung:
Migration
↓
Tạo bảng
↓
Model / Factory
↓
Định nghĩa dữ liệu
↓
Seeder
↓
Đưa dữ liệu vào database
Ví dụ Migration tạo bảng products, còn Seeder tạo những Product nằm trong bảng đó.
Nếu đang củng cố kiến thức về cấu trúc database trước khi làm Seeder, phần Laravel cơ bản sẽ hữu ích để nắm rõ mối quan hệ giữa Migration, Model và database.
Chạy Migration cùng Seeder
Trong quá trình phát triển, có thể cần xóa database và dựng lại từ đầu.
Laravel hỗ trợ:
php artisan migrate:fresh –seed
Lệnh này sẽ:
- Xóa các bảng hiện có.
- Chạy lại toàn bộ Migration.
- Chạy Seeder.
Đây là cách thuận tiện để nhanh chóng đưa database về trạng thái ban đầu trong môi trường development.
Lưu ý: migrate:fresh có thể xóa toàn bộ bảng trong database. Không nên sử dụng tùy tiện trên production.

Seeder và dữ liệu có quan hệ
Khi các bảng có khóa ngoại, thứ tự tạo dữ liệu rất quan trọng.
Ví dụ:
Category
↓
Product
↓
Order
↓
OrderItem
Nếu Product chứa category_id, Category cần được tạo trước.
Trong DatabaseSeeder có thể quy định thứ tự:
$this->call([
CategorySeeder::class,
ProductSeeder::class,
OrderSeeder::class,
]);
Nhờ vậy, Seeder hạn chế lỗi khi một bảng phụ thuộc vào dữ liệu của bảng khác.
Các lỗi thường gặp khi dùng Seeder
Seeder không chạy
Kiểm tra Seeder đã được gọi trong DatabaseSeeder chưa:
$this->call([
ProductSeeder::class,
]);
Hoặc chạy trực tiếp:
php artisan db:seed –class=ProductSeeder
Bảng chưa tồn tại
Nếu Seeder báo không tìm thấy bảng, hãy kiểm tra Migration:
php artisan migrate
Sau đó chạy lại Seeder.
Lỗi khóa ngoại
Nếu Product cần category_id, phải đảm bảo Category đã tồn tại trước khi tạo Product. Kiểm tra thứ tự các Seeder trong DatabaseSeeder.
Dữ liệu bị trùng
Nếu Seeder chạy nhiều lần, các giá trị unique như email hoặc slug có thể gây lỗi.
Có thể sử dụng updateOrCreate() hoặc thiết kế Seeder theo cách có thể chạy lặp an toàn.
Lỗi Mass Assignment
Khi sử dụng:
Product::create([…]);
hãy kiểm tra Model đã cho phép các thuộc tính tương ứng theo cơ chế Mass Assignment của Eloquent.
Kết luận
Laravel Seeder giúp tự động hóa quá trình đưa dữ liệu vào database và đặc biệt hữu ích trong phát triển, kiểm thử và khởi tạo project.
Những điểm quan trọng cần nhớ:
- Seeder dùng để tạo và chèn dữ liệu vào database.
- Tạo Seeder bằng php artisan make:seeder.
- Chạy Seeder bằng php artisan db:seed.
- Có thể gọi nhiều Seeder thông qua DatabaseSeeder.
- Factory và Faker phù hợp khi cần tạo số lượng lớn dữ liệu mẫu.
- Migration quản lý cấu trúc database, còn Seeder quản lý dữ liệu.
- Cần chú ý thứ tự tạo dữ liệu khi có khóa ngoại.
- Không nên chạy Seeder dữ liệu giả tùy tiện trên production.
Kết hợp đúng Migration → Model → Factory → Seeder giúp quá trình chuẩn bị database trong Laravel nhanh chóng, nhất quán và dễ kiểm soát hơn.

