M
Mr Sugiarto
Developer
27 Aug 2026 3 min read

Sampai episode ini kita belum punya tabel posts atau categories sama sekali — controller kita masih mengembalikan teks placeholder. Saatnya bikin struktur database sungguhan lewat migration.

Screenshot: Migration tabel categories dan posts berhasil dijalankan. Migration tabel categories dan posts berhasil dijalankan.

Kenapa migration, bukan bikin tabel manual di phpMyAdmin?

Migration adalah "version control" untuk skema database — setiap perubahan struktur (bikin tabel, tambah kolom, dst) ditulis sebagai file PHP yang bisa dijalankan ulang di komputer siapa pun, kapan pun. Ini penting untuk kerja tim: daripada share file .sql manual, cukup share migration file lewat git, lalu semua orang jalankan php artisan migrate.

Generate migration

php artisan make:migration create_categories_table
php artisan make:migration create_posts_table

Laravel otomatis bikin file dengan timestamp di nama file (2026_08_16_064553_create_categories_table.php) supaya urutan eksekusinya jelas.

Migration categories

public function up(): void
{
    Schema::create('categories', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->string('slug')->unique();
        $table->timestamps();
    });
}

public function down(): void
{
    Schema::dropIfExists('categories');
}
  • up() — dijalankan saat migration diterapkan (php artisan migrate)
  • down() — dijalankan saat migration di-rollback (php artisan migrate:rollback), harus mengembalikan database ke kondisi sebelumnya
  • $table->id() — kolom id auto-increment sebagai primary key
  • $table->string('slug')->unique() — kolom string yang tidak boleh duplikat, penting untuk URL yang SEO-friendly

Migration posts, dengan foreign key

public function up(): void
{
    Schema::create('posts', function (Blueprint $table) {
        $table->id();
        $table->foreignId('category_id')->nullable()->constrained()->nullOnDelete();
        $table->string('title');
        $table->string('slug')->unique();
        $table->text('body');
        $table->string('thumbnail')->nullable();
        $table->timestamps();
    });
}

Bagian paling penting: foreignId('category_id')->nullable()->constrained()->nullOnDelete(). Ini artinya:

  • category_id adalah foreign key yang menunjuk ke tabel categories (Laravel otomatis menebak nama tabel dari nama kolom)
  • nullable() — sebuah post boleh tidak punya kategori
  • nullOnDelete() — kalau kategori-nya dihapus, category_id di post yang terkait otomatis jadi NULL, bukan ikut terhapus atau error

Menjalankan migration

php artisan migrate
INFO  Running migrations.
2026_08_16_064553_create_categories_table ... DONE
2026_08_16_064554_create_posts_table ....... DONE

Kalau ingin cek status semua migration:

php artisan migrate:status

Rollback kalau ada yang salah

Kalau kamu sadar ada kesalahan struktur setelah migrate, jangan edit tabel manual lewat phpMyAdmin. Edit file migration-nya, lalu:

php artisan migrate:rollback
php artisan migrate

Atau kalau perubahan cukup besar dan kamu belum keberatan reset semua data development:

php artisan migrate:fresh

Selanjutnya

Tabel sudah ada, tapi kita masih query lewat SQL mentah. Episode berikutnya kita bikin Eloquent model untuk Post dan Category, lengkap dengan relasinya.

M
Mr Sugiarto

Developer

Bagian dari Series: Laravel 13 Dasar — Belajar Fundamental Lewat Blog Sederhana
Lihat Series Lengkap