Laravel 13 Pemula #12: Membuat Tabel Berita – Migration news

Tutorial Laravel 13 Pemula • Proyek Web Berita

#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!

Tujuan Kita:
  1. Membuat migration untuk tabel news.
  2. Menentukan kolom-kolom yang dibutuhkan: id, title, slug, content, image, category_id, timestamps.
  3. Menambahkan foreign key constraint (kunci asing) agar berita terhubung ke kategori.
  4. 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 tabel categories).
  • created_at dan updated_at → otomatis oleh Laravel.
💡 Mengapa pakai slug? Agar URL lebih cantik dan SEO-friendly. Contoh: /berita/laravel-13-rilis lebih baik daripada /berita?id=1.

🛠️ Langkah 1: Membuat Migration untuk Tabel News

Perintah Artisan

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

Menulis Kolom-Kolom di Method up()

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 kolom category_id sebagai foreign key yang terhubung ke kolom id di tabel categories. onDelete('cascade') berarti jika kategori dihapus, semua berita dalam kategori itu juga ikut terhapus.
Catatan Penting: Pastikan tabel 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.

php artisan make:model News

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 melalui create() atau update() (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)

Update Category.php

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

🏃 php artisan migrate

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.

Tips: Jika kamu ingin menguji relasi, coba tambahkan satu baris data manual di tabel 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:

  1. Di HeidiSQL, buka tabel news → tab Data → Insert.
  2. 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).
  3. Klik Save.

Ini hanya untuk latihan melihat data nanti saat kita membuat halaman index berita.

Ringkasan Hari Ini

  • ✅ Kita membuat migration create_news_table dengan kolom lengkap: title, slug, content, image, category_id.
  • ✅ Kita menambahkan foreign key ke tabel categories dengan cascade delete.
  • ✅ Kita membuat model News dan relasi belongsTo ke Category.
  • ✅ Kita memperbarui model Category dengan relasi hasMany ke News.
  • ✅ Kita menjalankan migration dan tabel news siap 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!

Semangat! Kamu sudah berhasil membuat tabel utama situs berita dan menghubungkannya dengan kategori. Relasi database adalah konsep yang sangat penting, dan kamu sudah mempraktikkannya. Hebat!

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)

Lebih baru Lebih lama

نموذج الاتصال