#12: Membuat Tabel Berita – Migration news (title, slug, content, image, category_id)
Halo, Arsitek Berita!
Setelah berhasil membuat CRUD untuk kategori, sekarang saatnya kita membangun tabel utama dari situs berita kita: tabel news (berita). Di sinilah semua berita akan disimpan: judul, isi berita, gambar, dan kategori mana yang menjadi induknya. Kita akan membuat migration seperti yang sudah kita pelajari saat membuat tabel categories. Siap? Ayo!
- Membuat migration untuk tabel
news. - Menentukan kolom-kolom yang dibutuhkan: id, title, slug, content, image, category_id, timestamps.
- Menambahkan foreign key constraint (kunci asing) agar berita terhubung ke kategori.
- Menjalankan migration dan memeriksa tabel di database.
📋 Apa Saja Kolom yang Kita Butuhkan?
Sebelum membuat migration, mari kita rencanakan dulu struktur tabel berita. Ini seperti membuat denah rumah sebelum membangun.
id→ nomor unik setiap berita (auto-increment).title→ judul berita (contoh: "Laravel 13 Rilis!").slug→ versi ramah URL (contoh: "laravel-13-rilis"). Unik, tidak boleh sama.content→ isi berita lengkap (bisa panjang, pakai tipe TEXT).image→ nama file gambar berita (contoh: "berita1.jpg").category_id→ ID kategori (penghubung ke tabelcategories).created_atdanupdated_at→ otomatis oleh Laravel.
/berita/laravel-13-rilis lebih baik daripada /berita?id=1.🛠️ Langkah 1: Membuat Migration untuk Tabel News
Buka terminal Laragon, pastikan di folder proyek situs-berita. Jalankan perintah:
php artisan make:migration create_news_table
Perintah ini akan membuat file migration baru di database/migrations/ dengan nama seperti 2025_03_26_123456_create_news_table.php.
Langkah 2: Mengisi Migration dengan Struktur Tabel
Buka file migration yang baru dibuat. Isi method up() dengan kode berikut:
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
public function up(): void
{
Schema::create('news', function (Blueprint $table) {
$table->id(); // id (auto-increment)
$table->string('title'); // judul berita
$table->string('slug')->unique(); // slug untuk URL, harus unik
$table->text('content'); // isi berita (panjang)
$table->string('image')->nullable(); // nama file gambar (boleh kosong)
$table->foreignId('category_id') // kolom category_id
->constrained('categories') // merujuk ke tabel categories
->onDelete('cascade'); // jika kategori dihapus, beritanya ikut hapus
$table->timestamps(); // created_at & updated_at
});
}
public function down(): void
{
Schema::dropIfExists('news');
}
};
Penjelasan setiap baris:
$table->string('title')→ judul berita, maksimal 255 karakter.$table->string('slug')->unique()→ slug unik, tidak boleh ada dua berita dengan slug sama.$table->text('content')→ tipe TEXT bisa menyimpan hingga 65.535 karakter (cukup untuk artikel panjang).$table->string('image')->nullable()→ gambar boleh tidak diisi (nullable).$table->foreignId('category_id')->constrained('categories')->onDelete('cascade')→ membuat kolomcategory_idsebagai foreign key yang terhubung ke kolomiddi tabelcategories.onDelete('cascade')berarti jika kategori dihapus, semua berita dalam kategori itu juga ikut terhapus.
categories sudah ada sebelum menjalankan migration ini. Jika belum, jalankan dulu migration kategori. Urutan migration penting!Langkah 3: Membuat Model News
Seperti kategori, kita juga butuh model untuk berita agar bisa berinteraksi dengan database dengan mudah.
Jalankan perintah:
php artisan make:model News
Buka file app/Models/News.php. Kita akan isi dengan relasi ke Category (belajar relasi).
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class News extends Model
{
use HasFactory;
// Kolom yang boleh diisi secara massal (untuk keamanan)
protected $fillable = [
'title', 'slug', 'content', 'image', 'category_id'
];
// Relasi: Sebuah berita milik satu kategori (belongs to)
public function category()
{
return $this->belongsTo(Category::class);
}
}
Penjelasan:
protected $fillable→ daftar kolom yang boleh diisi melaluicreate()atauupdate()(mencegah serangan mass assignment).belongsTo(Category::class)→ memberi tahu Laravel bahwa berita "dimiliki oleh" satu kategori. Nanti kita bisa akses$news->category->name.
Langkah 4: Menambahkan Relasi di Model Category (Balasan)
Buka app/Models/Category.php. Tambahkan relasi one-to-many (satu kategori punya banyak berita):
public function news()
{
return $this->hasMany(News::class);
}
Jadi model Category akan terlihat seperti:
class Category extends Model
{
use HasFactory;
protected $fillable = ['name', 'slug'];
public function news()
{
return $this->hasMany(News::class);
}
}
Sekarang kita bisa akses semua berita dalam suatu kategori dengan $category->news.
Langkah 5: Menjalankan Migration
Di terminal, jalankan perintah:
php artisan migrate
Karena kita sudah pernah menjalankan migration categories, Laravel hanya akan menjalankan migration baru (create_news_table). Output yang diharapkan:
Migrating: 2025_03_26_123456_create_news_table
Migrated: 2025_03_26_123456_create_news_table
Jika ada error, baca pesannya. Kemungkinan error karena foreign key constraint jika tabel categories belum ada. Tapi karena kita sudah membuatnya di tutorial #5, seharusnya aman.
🔍 Langkah 6: Memeriksa Tabel di HeidiSQL
Buka HeidiSQL (klik kanan Laragon → Database → HeidiSQL). Pilih database situs_berita. Sekarang akan ada tabel baru news. Klik tabel tersebut, lihat kolom-kolomnya: id, title, slug, content, image, category_id, created_at, updated_at.
Klik tab "Foreign Keys" untuk melihat bahwa foreign key news_category_id_foreign sudah menghubungkan category_id ke categories.id dengan aturan ON DELETE CASCADE.
news dengan mengisi category_id yang sesuai (misal 1 untuk kategori Teknologi). Nanti di tutorial CRUD berita kita akan buat form untuk menambah berita.Langkah Opsional: Mengisi Data Dummy untuk Testing (Seeder)
Kita bisa membuat data contoh berita secara cepat menggunakan Seeder. Tapi untuk sekarang, kita bisa menambahkan 1-2 berita manual lewat HeidiSQL agar tampilan nanti tidak kosong. Caranya:
- Di HeidiSQL, buka tabel
news→ tab Data → Insert. - Isi: title = "Belajar Laravel 13", slug = "belajar-laravel-13", content = "Ini adalah berita pertama tentang Laravel...", image = (kosong dulu), category_id = 1 (pastikan ada kategori dengan id 1).
- Klik Save.
Ini hanya untuk latihan melihat data nanti saat kita membuat halaman index berita.
Ringkasan Hari Ini
- ✅ Kita membuat migration
create_news_tabledengan kolom lengkap: title, slug, content, image, category_id. - ✅ Kita menambahkan foreign key ke tabel
categoriesdengan cascade delete. - ✅ Kita membuat model
Newsdan relasi belongsTo keCategory. - ✅ Kita memperbarui model
Categorydengan relasi hasMany keNews. - ✅ Kita menjalankan migration dan tabel
newssiap digunakan.
Apa Selanjutnya?
Setelah tabel berita jadi, kita akan membuat CRUD untuk berita! Kita akan buat controller NewsController, form untuk input berita dengan upload gambar, dan menampilkan daftar berita. Setelah itu, kita akan buat halaman depan situs berita yang bisa dibaca publik. Semakin seru!
Seri Tutorial Laravel 13 Pemula – Proyek Web Berita
Selanjutnya: #13: Mengenal Relasi – Menghubungkan Tabel Berita dengan Kategori (penjelasan lebih dalam tentang relasi dan cara menggunakannya di controller/view)