Database Seeder - Data Contoh
Di lesson ini, kita akan mengisi database dengan data contoh agar bisa langsung testing tanpa input manual satu per satu.
Apa itu Seeder?
Seeder adalah file yang berisi kode untuk mengisi database dengan data.
Kenapa butuh Seeder?
- Tidak perlu input manual puluhan data untuk testing
- Data bisa di-reset kapan saja
- Tim bisa punya data yang sama
- Demo aplikasi menjadi lebih hidup
Seeder adalah file yang berisi kode untuk mengisi database dengan data.
Kenapa butuh Seeder?
- Tidak perlu input manual puluhan data untuk testing
- Data bisa di-reset kapan saja
- Tim bisa punya data yang sama
- Demo aplikasi menjadi lebih hidup
Data yang Akan Dibuat:
| Poliklinik | 6 poli (Umum, Gigi, Anak, Kandungan, Mata, Jantung) |
| Dokter | 6 dokter dengan spesialisasi berbeda |
| Obat | 10 obat umum (Paracetamol, Amoxicillin, dll) |
| Pasien | 5 pasien contoh dengan data lengkap |
Step 1: Buat Seeder File
Lokasi: Terminal / Command Prompt
Aksi: [JALANKAN COMMAND]
Cara: Buka terminal di folder project, jalankan command berikut:
Aksi: [JALANKAN COMMAND]
Cara: Buka terminal di folder project, jalankan command berikut:
# Buat file seeder untuk master data
php artisan make:seeder MasterDataSeeder
Lokasi File:
Aksi: [UPDATE FILE]
Cara: Buka file yang baru dibuat, HAPUS SEMUA isinya, lalu PASTE kode di bawah ini:
database/seeders/MasterDataSeeder.phpAksi: [UPDATE FILE]
Cara: Buka file yang baru dibuat, HAPUS SEMUA isinya, lalu PASTE kode di bawah ini:
<?php
namespace Database\Seeders;
use App\Models\Dokter;
use App\Models\Obat;
use App\Models\Pasien;
use App\Models\Poliklinik;
use App\Models\JadwalPraktek;
use Illuminate\Database\Seeder;
class MasterDataSeeder extends Seeder
{
public function run(): void
{
// ===== POLIKLINIK =====
$polikliniks = [
['kode' => 'UMM', 'nama' => 'Poli Umum', 'is_active' => true],
['kode' => 'GIG', 'nama' => 'Poli Gigi', 'is_active' => true],
['kode' => 'ANK', 'nama' => 'Poli Anak', 'is_active' => true],
['kode' => 'KDN', 'nama' => 'Poli Kandungan', 'is_active' => true],
['kode' => 'MAT', 'nama' => 'Poli Mata', 'is_active' => true],
['kode' => 'JTG', 'nama' => 'Poli Jantung', 'is_active' => true],
];
foreach ($polikliniks as $poli) {
Poliklinik::create($poli);
}
$this->command->info('6 Poliklinik created!');
// ===== DOKTER =====
$dokters = [
[
'kode' => 'DKT001',
'nama' => 'Ahmad Wijaya',
'gelar_depan' => 'dr.',
'gelar_belakang' => '',
'spesialisasi' => 'Umum',
'poliklinik_id' => 1,
'tarif_konsultasi' => 50000,
'is_active' => true,
],
[
'kode' => 'DKT002',
'nama' => 'Siti Rahayu',
'gelar_depan' => 'drg.',
'gelar_belakang' => '',
'spesialisasi' => 'Gigi',
'poliklinik_id' => 2,
'tarif_konsultasi' => 75000,
'is_active' => true,
],
[
'kode' => 'DKT003',
'nama' => 'Budi Santoso',
'gelar_depan' => 'dr.',
'gelar_belakang' => 'Sp.A',
'spesialisasi' => 'Anak',
'poliklinik_id' => 3,
'tarif_konsultasi' => 100000,
'is_active' => true,
],
[
'kode' => 'DKT004',
'nama' => 'Dewi Lestari',
'gelar_depan' => 'dr.',
'gelar_belakang' => 'Sp.OG',
'spesialisasi' => 'Kandungan',
'poliklinik_id' => 4,
'tarif_konsultasi' => 125000,
'is_active' => true,
],
[
'kode' => 'DKT005',
'nama' => 'Rudi Hartono',
'gelar_depan' => 'dr.',
'gelar_belakang' => 'Sp.M',
'spesialisasi' => 'Mata',
'poliklinik_id' => 5,
'tarif_konsultasi' => 100000,
'is_active' => true,
],
[
'kode' => 'DKT006',
'nama' => 'Agus Prasetyo',
'gelar_depan' => 'dr.',
'gelar_belakang' => 'Sp.JP',
'spesialisasi' => 'Jantung',
'poliklinik_id' => 6,
'tarif_konsultasi' => 150000,
'is_active' => true,
],
];
foreach ($dokters as $dokter) {
Dokter::create($dokter);
}
$this->command->info('6 Dokter created!');
// ===== OBAT =====
$obats = [
['kode' => 'OBT001', 'nama' => 'Paracetamol 500mg', 'satuan' => 'Tablet', 'harga_jual' => 500, 'stok' => 1000],
['kode' => 'OBT002', 'nama' => 'Amoxicillin 500mg', 'satuan' => 'Kapsul', 'harga_jual' => 1500, 'stok' => 500],
['kode' => 'OBT003', 'nama' => 'Omeprazole 20mg', 'satuan' => 'Kapsul', 'harga_jual' => 2000, 'stok' => 300],
['kode' => 'OBT004', 'nama' => 'Cetirizine 10mg', 'satuan' => 'Tablet', 'harga_jual' => 1000, 'stok' => 400],
['kode' => 'OBT005', 'nama' => 'Ibuprofen 400mg', 'satuan' => 'Tablet', 'harga_jual' => 800, 'stok' => 600],
['kode' => 'OBT006', 'nama' => 'Vitamin C 500mg', 'satuan' => 'Tablet', 'harga_jual' => 500, 'stok' => 800],
['kode' => 'OBT007', 'nama' => 'Metformin 500mg', 'satuan' => 'Tablet', 'harga_jual' => 1200, 'stok' => 350],
['kode' => 'OBT008', 'nama' => 'Amlodipine 5mg', 'satuan' => 'Tablet', 'harga_jual' => 1500, 'stok' => 250],
['kode' => 'OBT009', 'nama' => 'Salbutamol Inhaler', 'satuan' => 'Pcs', 'harga_jual' => 35000, 'stok' => 50],
['kode' => 'OBT010', 'nama' => 'Infus RL 500ml', 'satuan' => 'Botol', 'harga_jual' => 15000, 'stok' => 100],
];
foreach ($obats as $obat) {
Obat::create($obat);
}
$this->command->info('10 Obat created!');
// ===== PASIEN =====
$pasiens = [
[
'no_rm' => 'RM-000001',
'nik' => '3171234567890001',
'nama' => 'Bambang Suryadi',
'jenis_kelamin' => 'L',
'tanggal_lahir' => '1985-05-15',
'alamat' => 'Jl. Sudirman No. 123, Jakarta',
'no_hp' => '081234567890',
],
[
'no_rm' => 'RM-000002',
'nik' => '3171234567890002',
'nama' => 'Sri Wahyuni',
'jenis_kelamin' => 'P',
'tanggal_lahir' => '1990-08-22',
'alamat' => 'Jl. Gatot Subroto No. 45, Jakarta',
'no_hp' => '081234567891',
],
[
'no_rm' => 'RM-000003',
'nik' => '3171234567890003',
'nama' => 'Andi Pratama',
'jenis_kelamin' => 'L',
'tanggal_lahir' => '1978-12-03',
'alamat' => 'Jl. Thamrin No. 67, Jakarta',
'no_hp' => '081234567892',
],
[
'no_rm' => 'RM-000004',
'nik' => '3171234567890004',
'nama' => 'Lisa Permata',
'jenis_kelamin' => 'P',
'tanggal_lahir' => '1995-03-10',
'alamat' => 'Jl. Kuningan No. 89, Jakarta',
'no_hp' => '081234567893',
],
[
'no_rm' => 'RM-000005',
'nik' => '3171234567890005',
'nama' => 'Hendra Wijaya',
'jenis_kelamin' => 'L',
'tanggal_lahir' => '1982-07-28',
'alamat' => 'Jl. Rasuna Said No. 12, Jakarta',
'no_hp' => '081234567894',
],
];
foreach ($pasiens as $pasien) {
Pasien::create($pasien);
}
$this->command->info('5 Pasien created!');
}
}
Step 2: Daftarkan Seeder di DatabaseSeeder
Lokasi File:
Aksi: [UPDATE FILE]
Cara: Buka file, HAPUS SEMUA isinya, lalu PASTE kode di bawah ini:
database/seeders/DatabaseSeeder.phpAksi: [UPDATE FILE]
Cara: Buka file, HAPUS SEMUA isinya, lalu PASTE kode di bawah ini:
<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
class DatabaseSeeder extends Seeder
{
/**
* Jalankan semua seeder aplikasi SIMRS
*/
public function run(): void
{
$this->call([
// 1. Role dan User (dari Lesson 5)
RolePermissionSeeder::class,
// 2. Master Data
MasterDataSeeder::class,
]);
$this->command->info('');
$this->command->info('=====================================');
$this->command->info(' SIMRS Database Seeding Complete! ');
$this->command->info('=====================================');
$this->command->info('');
$this->command->info('Login credentials:');
$this->command->info(' Admin: admin@simrs.test / password');
$this->command->info(' Dokter: dokter@simrs.test / password');
}
}
Penjelasan:
Urutan penting karena ada dependency (RolePermissionSeeder harus pertama untuk buat roles dan users).
$this->call() memanggil seeder lain secara berurutan.Urutan penting karena ada dependency (RolePermissionSeeder harus pertama untuk buat roles dan users).
Step 3: Jalankan Seeder
Lokasi: Terminal / Command Prompt
Aksi: [JALANKAN COMMAND]
Cara: Jalankan salah satu command berikut:
Aksi: [JALANKAN COMMAND]
Cara: Jalankan salah satu command berikut:
# OPSI 1: Reset database + jalankan semua seeder
# WARNING: Ini akan MENGHAPUS semua data yang ada!
php artisan migrate:fresh --seed
# OPSI 2: Jalankan seeder saja (tanpa reset database)
php artisan db:seed
# OPSI 3: Jalankan seeder tertentu saja
php artisan db:seed --class=MasterDataSeeder
Perbedaan Command:
migrate:fresh --seed |
HAPUS semua tabel, buat ulang, isi data → untuk reset total |
db:seed |
Jalankan seeder tanpa hapus data → bisa duplikat jika dijalankan 2x |
db:seed --class=X |
Jalankan seeder tertentu saja → untuk testing |
Output yang Diharapkan:
INFO Seeding database. 6 roles berhasil dibuat! 6 users contoh berhasil dibuat! 6 Poliklinik created! 6 Dokter created! 10 Obat created! 5 Pasien created! ===================================== SIMRS Database Seeding Complete! ===================================== Login credentials: Admin: admin@simrs.test / password Dokter: dokter@simrs.test / password
Full Source Code
Files yang Dibuat (2 files):
| 1 | database/seeders/MasterDataSeeder.php |
[BUAT FILE BARU] | Step 1 |
| 2 | database/seeders/DatabaseSeeder.php |
[UPDATE FILE] | Step 2 |
Checkpoint - Test Manual
Langkah Testing:
1. Jalankan Seeder:
Pastikan tidak ada error dan muncul pesan "SIMRS Database Seeding Complete!"
2. Cek di phpMyAdmin:
Buka
Verifikasi tabel-tabel berikut:
3. Test Login:
- Buka
- Login dengan
- Harus masuk ke Dashboard
1. Jalankan Seeder:
php artisan migrate:fresh --seedPastikan tidak ada error dan muncul pesan "SIMRS Database Seeding Complete!"
2. Cek di phpMyAdmin:
Buka
http://localhost/phpmyadmin → pilih database simrs_dbVerifikasi tabel-tabel berikut:
polikliniks |
Harus ada 6 record |
dokters |
Harus ada 6 record |
obats |
Harus ada 10 record |
pasiens |
Harus ada 5 record |
users |
Harus ada 6 record (dari RolePermissionSeeder) |
roles |
Harus ada 6 record |
3. Test Login:
- Buka
http://localhost:8000/login- Login dengan
admin@simrs.test / password- Harus masuk ke Dashboard
Troubleshooting Error Umum:
Error: "Class Model not found"
Solusi: Pastikan model sudah dibuat. Jalankan
Error: "SQLSTATE[23000]: Duplicate entry"
Solusi: Data sudah ada. Gunakan
Error: "SQLSTATE[42S02]: Table doesn't exist"
Solusi: Migration belum dijalankan. Jalankan
Error: "Class Model not found"
Solusi: Pastikan model sudah dibuat. Jalankan
php artisan make:model NamaModelError: "SQLSTATE[23000]: Duplicate entry"
Solusi: Data sudah ada. Gunakan
php artisan migrate:fresh --seed untuk resetError: "SQLSTATE[42S02]: Table doesn't exist"
Solusi: Migration belum dijalankan. Jalankan
php artisan migrate dulu
Ringkasan
Yang Sudah Dibuat:
1. MasterDataSeeder:
- 6 Poliklinik (Umum, Gigi, Anak, Kandungan, Mata, Jantung)
- 6 Dokter dengan spesialisasi berbeda
- 10 Obat umum dengan stok
- 5 Pasien contoh dengan data lengkap
2. DatabaseSeeder:
- Entry point yang memanggil semua seeder
- Menampilkan kredensial login setelah seeding
1. MasterDataSeeder:
- 6 Poliklinik (Umum, Gigi, Anak, Kandungan, Mata, Jantung)
- 6 Dokter dengan spesialisasi berbeda
- 10 Obat umum dengan stok
- 5 Pasien contoh dengan data lengkap
2. DatabaseSeeder:
- Entry point yang memanggil semua seeder
- Menampilkan kredensial login setelah seeding
Data Contoh yang Sudah Ada:
| Tabel | Jumlah |
|---|---|
| Users | 6 |
| Roles | 6 |
| Poliklinik | 6 |
| Dokter | 6 |
| Obat | 10 |
| Pasien | 5 |
Lesson Berikutnya:
Di Lesson 7: Struktur Folder dan Best Practices, kita akan melihat:
- Bagaimana mengorganisir file di Laravel
- Naming convention yang baik
- Di mana meletakkan kode apa
Ini penting agar project tetap rapi saat semakin besar.
Di Lesson 7: Struktur Folder dan Best Practices, kita akan melihat:
- Bagaimana mengorganisir file di Laravel
- Naming convention yang baik
- Di mana meletakkan kode apa
Ini penting agar project tetap rapi saat semakin besar.