Database Seeder - Data Master & Transaksi

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
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:
# Buat file seeder untuk master data
php artisan make:seeder MasterDataSeeder
Lokasi File: database/seeders/MasterDataSeeder.php
Aksi: [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: database/seeders/DatabaseSeeder.php
Aksi: [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:

$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:
# 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:
php artisan migrate:fresh --seed
Pastikan tidak ada error dan muncul pesan "SIMRS Database Seeding Complete!"

2. Cek di phpMyAdmin:
Buka http://localhost/phpmyadmin → pilih database simrs_db

Verifikasi 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 php artisan make:model NamaModel

Error: "SQLSTATE[23000]: Duplicate entry"
Solusi: Data sudah ada. Gunakan php artisan migrate:fresh --seed untuk reset

Error: "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
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.