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.
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()— kolomidauto-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_idadalah foreign key yang menunjuk ke tabelcategories(Laravel otomatis menebak nama tabel dari nama kolom)nullable()— sebuah post boleh tidak punya kategorinullOnDelete()— kalau kategori-nya dihapus,category_iddi post yang terkait otomatis jadiNULL, 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.