Relasi Database

Di dunia nyata, data jarang berdiri sendiri. Biasanya data saling berhubungan, misalnya:

  • Satu Kategori memiliki banyak Produk.
  • Satu User memiliki banyak Pesanan.

Ini disebut relasi One-to-Many (Satu-ke-Banyak), relasi yang paling sering digunakan saat mendesain database.

1. Konsep Foreign Key

Foreign Key (Kunci Asing) adalah kolom di satu tabel yang merujuk ke Primary Key (Kunci Utama) di tabel lain.

Tabel kategori:

id (Primary Key)nama_kategori
1Elektronik
2Pakaian

Tabel produk:

idnama_produkhargakategori_id (Foreign Key)
10Laptop50001
11Kemeja2002

Di sini, kategori_id di tabel produk merujuk ke id di tabel kategori. Dengan menyimpan angka 1 saja, kita tahu bahwa Laptop adalah Elektronik, tanpa perlu menulis kata "Elektronik" berulang kali di tabel produk.

2. Membuat Tabel Berelasi (SQL)

-- 1. Buat tabel utama (Kategori) terlebih dahulu
CREATE TABLE kategori (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nama_kategori VARCHAR(50) NOT NULL
);

-- 2. Buat tabel kedua (Produk) yang merujuk ke Kategori
CREATE TABLE produk (
    id INT AUTO_INCREMENT PRIMARY KEY,
    nama_produk VARCHAR(100) NOT NULL,
    harga INT NOT NULL,
    kategori_id INT,
    
    -- Mendefinisikan relasi Foreign Key
    FOREIGN KEY (kategori_id) REFERENCES kategori(id) 
        ON DELETE SET NULL 
        ON UPDATE CASCADE
);

Apa itu ON DELETE SET NULL? Jika kategori "Elektronik" dihapus dari database, produk "Laptop" tidak ikut terhapus, melainkan kategori_id-nya secara otomatis menjadi NULL (Kosong).

Pilihan lainnya adalah ON DELETE CASCADE (Jika kategori dihapus, SEMUA produk di dalam kategori tersebut ikut terhapus secara otomatis! Hati-hati menggunakannya).

3. Menampilkan Data Berelasi (JOIN)

Untuk menampilkan produk beserta nama kategorinya di halaman web, kita menggunakan perintah JOIN yang sudah dipelajari di bab SQL Lanjutan.

<?php
require 'config/database.php';

// Ambil produk gabung dengan kategori
$sql = "SELECT produk.*, kategori.nama_kategori 
        FROM produk 
        LEFT JOIN kategori ON produk.kategori_id = kategori.id";
        
$stmt = $pdo->query($sql);
$produkList = $stmt->fetchAll();
?>

<!-- Menampilkan di HTML -->
<table border="1">
    <tr>
        <th>Nama Produk</th>
        <th>Kategori</th>
        <th>Harga</th>
    </tr>
    <?php foreach($produkList as $item): ?>
    <tr>
        <td><?= htmlspecialchars($item['nama_produk']) ?></td>
        
        <!-- Jika NULL, tampilkan teks default -->
        <td><?= htmlspecialchars($item['nama_kategori'] ?? 'Tidak ada kategori') ?></td>
        
        <td>Rp <?= number_format($item['harga'], 0, ',', '.') ?></td>
    </tr>
    <?php endforeach; ?>
</table>

4. Form Tambah Data Berelasi (Dropdown)

Saat membuat form untuk menambah produk baru, kita tidak menyuruh user mengetik angka ID kategori (1, 2, 3), melainkan memilih dari Dropdown menu (<select>).

File tambah-produk.php:

<?php
require 'config/database.php';

// Ambil daftar kategori dari database untuk mengisi Dropdown
$stmt = $pdo->query("SELECT * FROM kategori ORDER BY nama_kategori ASC");
$kategoriList = $stmt->fetchAll();
?>

<form action="simpan-produk.php" method="POST">
    <label>Nama Produk:</label>
    <input type="text" name="nama_produk" required><br><br>
    
    <label>Kategori:</label>
    <select name="kategori_id" required>
        <option value="">-- Pilih Kategori --</option>
        
        <!-- Looping kategori dari database -->
        <?php foreach($kategoriList as $kat): ?>
            <option value="<?= $kat['id'] ?>">
                <?= htmlspecialchars($kat['nama_kategori']) ?>
            </option>
        <?php endforeach; ?>
        
    </select><br><br>
    
    <label>Harga:</label>
    <input type="number" name="harga" required><br><br>
    
    <button type="submit">Simpan Produk</button>
</form>

Penjelasan:

  1. User melihat teks yang ramah (misal: "Elektronik") di dropdown.
  2. Namun, atribut value="<?= $kat['id'] ?>" memastikan bahwa ketika form dikirim (submit), yang dikirim ke PHP adalah angka ID-nya (misal: 1).
  3. Di file simpan-produk.php, kamu tinggal melakukan INSERT seperti biasa menggunakan $_POST['kategori_id'].

Dengan memahami relasi database, kamu sudah siap membangun sistem yang lebih kompleks seperti E-Commerce atau Blog Multi-Kategori!