Belajar Laravel 13 #4: Database Migration dan Seeding
Heru Iryanto
Teacher, Content Creator and Full-Stack DeveloperDi dunia amatir, jika disuruh membuat tabel artikel di Database, seorang Programmer akan membuka browser, mengetik localhost/phpmyadmin, mengeklik tombol ‘New Table’, dan memasukkan kolom id, judul, secara manual satu per satu.
Bagaimana jika proyek tersebut digarap oleh 5 Programmer yang berbeda komputernya? Apakah mereka berlima harus melakukan “Klik-Klik” manual yang sama di phpMyAdmin mereka masing-masing? Jawabannya Tidak! Insinyur menggunakan Migrations.
1️⃣ Migrations: Cetak Biru (Blueprint) Database
Migration adalah sistem kendali versi (seperti Git) namun khusus untuk Database. Kita mendeskripsikan kerangka bentuk tabel langsung di dalam file PHP. Jika file ini dijalankan, Laravel akan otomatis menjebol MySQL/TablePlus Anda, lalu menciptakan tabelnya di sana!
Mari membuat tabel artikel:
Buka Terminal, panggil pembantu (Artisan):
php artisan make:migration create_artikels_tableUntuk nama table harus menggunakan huruf kecil dan ditambahkan akhiran ’s’. Contoh:
posts,users,products,artikels,kategoris, dll. Jika tidak menggunakan akhiran ’s’, Laravel akan mengembalikkan error “Table artikels does not exist”.Kalau tabel nya sudah berakhiran ’s’ bagaimana ? Contohnya tabel
penulis. Untuk mengatasi error, biasanya kita menambahkanprotected $table = 'penulis';di modelPenulis, maka nanti laravel tidak akan mencari tabelpenulisstapipenulis.Setelah perintah diatas dijalankan, Laravel akan otomatis menciptakan sebuah file dengan penanda jam (contoh:
2026_07_19_create_artikels_table.php) di dalam folderdatabase/migrations/.Buka file tersebut, Anda akan melihat sebuah default file migration. Ketikkan kerangka cetak biru tabel Anda seperti ini (tambahkan
juduldanisi_berita):// Isi file Migration public function up(): void { // Memerintahkan Schema untuk membuat tabel baru 'artikels' Schema::create('artikels', function (Blueprint $table) { // $table->tipeData('nama_kolom') $table->id(); // Membuat kolom ID otomatis (Primary Key) $table->string('judul', 150); // Kolom Teks Pendek (Maks 150 Karakter) $table->text('isi_berita'); // Kolom Teks Panjang tak terbatas // PENTING: Timestamp otomatis membuat kolom 'created_at' dan 'updated_at' $table->timestamps(); }); }Tipe data yang sering digunakan:
id(): Kolom ID otomatis (Primary Key)string('nama_kolom', 150): Kolom Teks Pendek (Maks 150 Karakter)text('nama_kolom'): Kolom Teks Panjang tak terbatasinteger('nama_kolom'): Kolom Angka Bulatdecimal('nama_kolom', 10, 2): Kolom Angka Desimal (10 digit total, 2 digit desimal)boolean('nama_kolom'): Kolom Boolean (True/False)date('nama_kolom'): Kolom Tanggaldatetime('nama_kolom'): Kolom Tanggal dan Waktutimestamps(): Kolom Timestamp otomatis (created_at dan updated_at)
Kalau suatu saat kita membuat
idnya tidak otomatis, misal$table->id('nisn');bagaimana ? Maka kolom nisn akan otomatis dibuat menjadi primary key. Namun di model nya kita harus memberi tahu laravel bahwa kolom id nya bukanidtapinisndengan cara :protected $primaryKey = 'nisn';di dalam modelnya.Sekarang mari kita eksekusi Cetak Biru tersebut. Aktifkan Server Laragon Anda terlebih dahulu, lalu di Terminal ketikkan perintah berikut:
php artisan migrateSeketika, Laravel akan memproduksi tabel
artikelstersebut ke dalam Database ‘TablePlus’ Anda, silakan cek TablePlus Anda.
Jika Anda bekerja dalam sebuah tim, cukup copy paste file migration tersebut ke komputer teman Anda (bisa via git atau lainnya). Teman Anda di komputer lain cukup mengetik perintah yang sama yaitu php artisan migrate dan Database-nya akan sama persis dengan milik Anda tanpa perlu file ekspor .sql jelek!
2️⃣ Fitur Pembatalan (Rollback)
Oh, bos Anda bilang bahwa kolom isi_berita itu salah nama? Harusnya konten?
Jangan hapus manual di TablePlus! Di file yang sama, ada fungsi down(). Fungsi ini berguna sebagai tombol Undo (Batal).
Ketik di terminal:
php artisan migrate:rollback
Seketika, tabel artikels akan hilang dilenyapkan. Anda bebas memperbaiki filenya, lalu merajutnya (migrate) kembali dengan perintah php artisan migrate atau php artisan migrate:refresh (menghapus tabel yang sudah ada dan membuat ulang) setelah kamu merubah isi_berita menjadi konten di dalam function up.
php artisan migrate
3️⃣ Seeding: Menyuntik Data Palsu Secara Gaib
Tabel artikels Anda sudah jadi, tapi masih kosong. Bagaimana cara menampilkannya ke desain Front-End Tailwind Anda jika isinya belum ada?
Mengisi manual 50 data Insert sangat melelahkan. Gunakan Seeder & Factory.
Laravel memiliki perpustakaan robot bernama Faker yang ahli mengarang bebas bahasa manusia (mengarang nama, alamat, paragraf, dsb).
Buat model
Artikelterlebih dahulu sebelum membuat seeder:php artisan make:model ArtikelModel adalah avatar atau perwakilan dari sebuah tabel di database.
Perintah diatas akan membuat sebuah file model artikel (
Artikel.php) di dalam folderapp/Models/.Biasakan untuk nama model diawali dengan huruf besar, seperti
User,Post,Commentagar lebih mudah dikenali dan beda dari nama tabel.Buka file
app/Models/Artikel.phpdan edit menjadi seperti ini:<?php namespace App\Models; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\Factories\HasFactory; class Artikel extends Model { use HasFactory; // Tambahkan baris ini di bawah() protected $fillable = [ 'judul', 'konten' ]; }Penjelasan:
use Illuminate\Database\Eloquent\Factories\HasFactory;adalah baris yang wajib ada untuk mengaktifkan fitur pabrik (factory). Kemudian nanti dipanggil denganuse HasFactory;di bawah classArticle.protected $fillableberfungsi untuk memberitahu Laravel kolom mana saja di tabelartikelsyang boleh diisi datanya via program. Jika Anda tidak menulis ini, Laravel akan menolak menyimpan data (mengembalikan errorMassAssignmentException) demi keamanan. Meskipun terkadang jika dengan seeder dan kamu tidak menuliskan protected$fillablepun tidak apa-apa, namun sangat tidak dianjurkan dan berisiko tinggi bagi keamanan aplikasi anda di masa mendatang.
Buat Pabrik Data:
php artisan make:factory ArtikelFactoryPerintah diatas akan membuatkan sebuah file baru. Buka filenya di
database/factories/ArtikelFactory.php, lalu perbaiki menjadi seperti ini untuk bagiandefinition():public function definition(): array { // Suruh robot Faker mengarang data acak! return [ 'judul' => fake()->sentence(5), // Karang kalimat judul 5 kata 'konten' => fake()->paragraphs(3, true), // Karang 3 paragraf panjang ]; }True adalah nilai boolean (benar) yang akan memberi perintah pada faker untuk membuat paragrafnya menjadi lebih panjang (sesuai dengan panjang artikel pada umumnya). Kalau tidak menggunakan true, maka paragrafnya akan sangat pendek (sekitar 2 kalimat saja).
Buka file komando
database/seeders/DatabaseSeeder.phpdan beritahu mesin untuk mereplikasinya 20 kali lipat:// Mencetak 20 Artikel bohong dengan kecepatan cahaya! \App\Models\Artikel::factory(20)->create();Atau jika kamu mau penulisannya lebih sederhana, cukup tulis seperti ini:
use App\Models\Artikel; // ... // 20 data palsu Artikel::factory(20)->create();Perintah diatas akan menghasilkan 20 data artikel palsu yang sama dengan perintah sebelumnya.
Jika ingin membuat 1 data saja secara manual,
juduldankontendibuat manual di seed. Kodingannya seperti ini:use App\Models\Artikel; // ... // 1 data Artikel::create([ 'judul' => 'Judul Artikel Manual', 'konten' => 'Konten Artikel Manual', ]);Perbedaan tanda
->dan=>adalah:- tanda
->digunakan untuk memanggil method (fungsi) - tanda
=>digunakan untuk membuat array (pasangan key dan value pada array).
Kodingan
Artikel::factory(20)->create()dalam materi sebelumnya bisa diartikan sebagai “Tolong akses “Artikel” lalu panggil “factory” lalu “buat” (Create) 20 data artikel sekaligus”.- tanda
Eksekusi di Terminal:
php artisan db:seed
Selesai! Buka TablePlus Anda, Anda memiliki 20 baris data artikel bahasa Latin acak yang siap digunakan untuk menguji desain website Anda!
🗽 Kesimpulan
Jika Anda telah menguasai migrate dan seed, Anda telah menghancurkan 20 jam kerja sia-sia (copy-paste data dummy manual) menjadi 5 detik. Inilah kekuatan skala penuh arsitektur korporat!
Namun, tabel Database murni hanyalah brankas kosong. Bagaimana cara sistem Laravel (Sang Pelayan) memanggil keduapuluh artikel tadi untuk dihidangkan ke Piring Blade HTML?
Lupakan kodingan jadul SQL SELECT * FROM. Kita akan memanggil Jin Database (ORM) terhebat di dunia pada materi Keajaiban Eloquent ORM.
