> For the complete documentation index, see [llms.txt](https://learn.devlabss.my.id/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://learn.devlabss.my.id/laravel/bab-10-relasi-database/10.2-konfigurasi-relasi-di-model.md).

# 10.2 Konfigurasi Relasi di Model

## Konfigurasi relasi di model

Setelah paham konsep relasi one-to-many, sekarang kita masuk ke praktiknya.

Di subbab ini, kita akan menyiapkan hubungan antara:

* model `Kategori`
* model `Buku`

Supaya Laravel benar-benar paham bahwa satu kategori punya banyak buku.

### Teori awal dan analogi

Bayangkan Anda sedang membuat kartu katalog perpustakaan.

Pada kartu buku, Anda menulis buku itu masuk ke kategori apa.

Lalu pada kartu kategori, Anda bisa melihat daftar buku yang berada di dalamnya.

Di Laravel, dua arah hubungan ini ditulis pada model.

Jadi model bukan hanya mewakili tabel.

Model juga bisa menjelaskan hubungan antar data.

### Target praktik subbab ini

Setelah menyelesaikan subbab ini, Anda seharusnya bisa:

* membuat model `Kategori` jika belum ada
* menambahkan kolom `kategori_id` pada tabel `buku`
* menulis relasi `hasMany` pada model `Kategori`
* menulis relasi `belongsTo` pada model `Buku`

### Langkah praktik step-by-step

Ikuti langkah berikut dengan urut.

{% stepper %}
{% step %}

### Buat model dan migration kategori jika belum ada

Kalau Anda belum pernah membuat tabel kategori pada BAB 8, jalankan:

```bash
php artisan make:model Kategori -m
```

Perintah ini akan membuat model `Kategori` dan file migration baru.
{% endstep %}

{% step %}

### Isi migration tabel kategori

Buka file migration kategori yang baru dibuat.

Lalu isi bagian `up()` menjadi seperti ini:

```php
public function up(): void
{
    Schema::create('kategori', function (Blueprint $table) {
        $table->id();
        $table->string('nama_kategori');
        $table->timestamps();
    });
}
```

Di modul ini kita memakai nama tabel `kategori`.
{% endstep %}

{% step %}

### Tambahkan `kategori_id` ke tabel buku

Sekarang buat migration baru untuk menambah foreign key:

```bash
php artisan make:migration add_kategori_id_to_buku_table --table=buku
```

Lalu isi migration itu seperti ini:

```php
public function up(): void
{
    Schema::table('buku', function (Blueprint $table) {
        $table->foreignId('kategori_id')
            ->nullable()
            ->constrained('kategori')
            ->onDelete('set null');
    });
}
```

Untuk tahap awal, kita buat `nullable()` agar data buku lama tidak langsung bermasalah.
{% endstep %}

{% step %}

### Jalankan migration

Setelah semua migration siap, jalankan:

```bash
php artisan migrate
```

Kalau berhasil, tabel `kategori` akan terbentuk dan tabel `buku` akan punya kolom `kategori_id`.
{% endstep %}

{% step %}

### Atur model `Kategori`

Buka file:

`app/Models/Kategori.php`

Lalu isi seperti ini:

```php
<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Kategori extends Model
{
    use HasFactory;

    protected $table = 'kategori';

    protected $fillable = [
        'nama_kategori',
    ];

    public function bukus()
    {
        return $this->hasMany(Buku::class, 'kategori_id');
    }
}
```

Method `bukus()` berarti satu kategori bisa memiliki banyak buku.
{% endstep %}

{% step %}

### Atur model `Buku`

Sekarang buka file:

`app/Models/Buku.php`

Lalu tambahkan relasi berikut:

```php
public function kategori()
{
    return $this->belongsTo(Kategori::class, 'kategori_id');
}
```

Kalau model `Buku` belum mengimpor `Kategori`, tambahkan juga:

```php
use App\Models\Kategori;
```

Method `kategori()` berarti satu buku hanya menunjuk ke satu kategori.
{% endstep %}
{% endstepper %}

### Penjelasan pasca-praktik

Sekarang mari kita bedah bagian yang paling penting.

#### 1. `foreignId('kategori_id')`

Baris ini menambahkan kolom foreign key pada tabel `buku`.

Kolom inilah yang menghubungkan satu buku ke kategori tertentu.

#### 2. `constrained('kategori')`

Bagian ini memberi tahu Laravel bahwa `kategori_id` mengacu ke tabel `kategori`.

Jadi relasinya bukan sekadar angka biasa.

Angka itu menunjuk ke data kategori yang nyata.

#### 3. `hasMany(Buku::class, 'kategori_id')`

Relasi ini ditulis di model `Kategori`.

Artinya satu kategori bisa punya banyak data buku.

#### 4. `belongsTo(Kategori::class, 'kategori_id')`

Relasi ini ditulis di model `Buku`.

Artinya satu buku dimiliki oleh satu kategori.

### Alur data teknis

Saat relasi ini sudah benar, Laravel akan mengerti:

* dari satu objek `Kategori`, Anda bisa mengambil banyak `Buku`
* dari satu objek `Buku`, Anda bisa mengambil satu `Kategori`

Inilah dasar yang nanti dipakai saat data relasi ditampilkan di view.

### Output yang harus terlihat

Setelah subbab ini selesai, hasil berikut seharusnya sudah terlihat:

* tabel `kategori` berhasil dibuat
* tabel `buku` memiliki kolom `kategori_id`
* model `Kategori` punya method `bukus()`
* model `Buku` punya method `kategori()`
* migration relasi berjalan tanpa error foreign key

### Troubleshooting yang paling sering

Masalah yang paling sering muncul:

* **`Base table or view not found`** — tabel `kategori` belum dibuat
* **kolom `kategori_id` tidak ada** — migration tambahan belum dijalankan
* **relasi selalu kosong** — foreign key belum terisi
* **class `Kategori` tidak ditemukan** — model belum dibuat atau belum di-import

{% hint style="warning" %}
Kalau relasi model sudah benar tetapi hasilnya kosong, jangan langsung menyalahkan Laravel. Cek dulu apakah kolom `kategori_id` pada data buku memang sudah berisi nilai.
{% endhint %}

{% hint style="info" %}
Memakai `nullable()` pada `kategori_id` membantu Anda bertransisi lebih aman saat proyek sudah punya data buku lama.
{% endhint %}

### Poin evaluasi bab 10.2

Pastikan Anda sudah memahami poin berikut:

* Saya bisa menambahkan tabel `kategori`.
* Saya bisa menambahkan kolom `kategori_id` pada tabel `buku`.
* Saya paham `Kategori` memakai `hasMany`.
* Saya paham `Buku` memakai `belongsTo`.
* Saya paham relasi ini bergantung pada foreign key yang benar.

Jika semuanya sudah jelas, lanjut ke [10.3 Menampilkan Relasi di View Blade](/laravel/bab-10-relasi-database/10.3-menampilkan-relasi-di-view-blade.md).


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://learn.devlabss.my.id/laravel/bab-10-relasi-database/10.2-konfigurasi-relasi-di-model.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
