KodeJs
Panduan Relasi Eloquent Laravel 13: One-to-Many & Many-to-Many
Laravel3 menit baca

Panduan Relasi Eloquent Laravel 13: One-to-Many & Many-to-Many

Kembali ke Blog
Egi Samsul Mu'arifEgi Samsul Mu'arif1 September 20263 menit baca

Pelajari cara membuat relasi database One to Many dan Many to Many di Laravel 13 menggunakan Eloquent ORM. Lengkap dengan contoh kode dan seeder!

Saat membangun aplikasi web nyata, data yang kita kelola hampir selalu saling terhubung. Misalnya, satu pengguna bisa memiliki banyak postingan blog, atau satu produk bisa memiliki banyak kategori.

Di Laravel 13, pengolahan hubungan antartabel dipermudah melalui fitur Eloquent Relationship. Tanpa perlu menulis kueri JOIN SQL yang rumit, kamu bisa menghubungkan model data cukup menggunakan metode PHP yang ekspresif.

Artikel ini akan membahas dua jenis relasi yang paling sering digunakan dalam pengembangan aplikasi: One-to-Many dan Many-to-Many.

1. Relasi One-to-Many (Satu ke Banyak)

Relasi One-to-Many terjadi ketika satu baris data di Tabel A dapat terhubung ke banyak baris data di Tabel B, tetapi data di Tabel B hanya dimiliki oleh satu data di Tabel A.

Studi Kasus: Satu Category memiliki banyak Product.

┌─────────────────┐             ┌─────────────────┐
│   categories    │  1       N  │    products     │
├─────────────────┼────────────►├─────────────────┤
│ id              │             │ id              │
│ name            │             │ category_id (FK)│
└─────────────────┘             │ name, price     │
                                └─────────────────┘

Langkah A: Buat Migration

Tambahkan foreign key category_id pada tabel products:

PHP

// database/migrations/xxxx_create_products_table.php
Schema::create('products', function (Blueprint $table) {
    $table->id();
    $table->foreignId('category_id')->constrained()->cascadeOnDelete();
    $table->string('name');
    $table->integer('price');
    $table->timestamps();
});

Langkah B: Definisi Relasi pada Model

Buka model Category.php dan Product.php:

PHP

// app/Models/Category.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;

class Category extends Model
{
    // Category memiliki banyak Product (hasMany)
    public function products(): HasMany
    {
        return $this->hasMany(Product::class);
    }
}

PHP

// app/Models/Product.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;

class Product extends Model
{
    // Product dimiliki oleh Category (belongsTo)
    public function category(): BelongsTo
    {
        return $this->belongsTo(Category::class);
    }
}

Cara Penggunaan di Controller/Blade:

PHP

// Mengambil semua produk dari kategori ID 1
$category = Category::find(1);
$products = $category->products;

// Mengambil nama kategori dari sebuah produk
$product = Product::find(10);
echo $product->category->name;

2. Relasi Many-to-Many (Banyak ke Banyak)

Relasi Many-to-Many terjadi jika data di Tabel A dapat memiliki banyak data di Tabel B, dan sebaliknya data di Tabel B juga dapat dimiliki oleh banyak data di Tabel A. Relasi ini membutuhkan tabel perantara (Pivot Table).

Studi Kasus: Satu Student bisa mengambil banyak Course, dan satu Course diikuti oleh banyak Student.

┌──────────┐       ┌─────────────────┐       ┌──────────┐
│ students │ 1   N │ course_student  │ N   1 │ courses  │
├──────────┼──────►│   (Pivot)       │◄──────┼──────────┤
│ id, name │       │ student_id      │       │ id, title│
└──────────┘       │ course_id       │       └──────────┘
                   └─────────────────┘

Langkah A: Buat Pivot Table Migration

Nama tabel pivot secara standar berupa gabungan dua nama model tunggal berdasarkan urutan abjad (course_student):

Bash

php artisan make:migration create_course_student_table

PHP

// database/migrations/xxxx_create_course_student_table.php
Schema::create('course_student', function (Blueprint $table) {
    $table->id();
    $table->foreignId('student_id')->constrained()->cascadeOnDelete();
    $table->foreignId('course_id')->constrained()->cascadeOnDelete();
});

Langkah B: Definisi Relasi pada Model

Gunakan metode belongsToMany() pada kedua model:

PHP

// app/Models/Student.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Student extends Model
{
    public function courses(): BelongsToMany
    {
        return $this->belongsToMany(Course::class);
    }
}

PHP

// app/Models/Course.php
namespace App\Models;

use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsToMany;

class Course extends Model
{
    public function students(): BelongsToMany
    {
        return $this->belongsToMany(Student::class);
    }
}

Cara Penggunaan (Attach & Detach):

PHP

$student = Student::find(1);

// Menghubungkan siswa ke kursus ID 2 dan 3
$student->courses()->attach([2, 3]);

// Melepas hubungan siswa dari kursus ID 2
$student->courses()->detach(2);

// Mengambil daftar kursus siswa
foreach ($student->courses as $course) {
    echo $course->title;
}

Tips Performa: Hindari Masalah N+1 Query

Saat menampilkan daftar data berserta relasinya di Blade View, hindari kueri berulang (N+1 Problem) dengan mengaktifkan fitur Eager Loading menggunakan metode with():

PHP

// BUKAN SEPERTI INI (Memicu kueri berulang):
$products = Product::all(); 

// GUNAKAN EAGER LOADING (Hanya 2 kueri SQL):
$products = Product::with('category')->get();

Kesimpulan

Menguasai relasi Eloquent di Laravel 13 mempermudah kamu membangun struktur data yang rapi dan performan. Dengan metode hasMany, belongsTo, dan belongsToMany, penulisan logika database menjadi jauh lebih bersih dan ramah pengembang.


Egi Samsul Mu'arif

Ditulis oleh

Egi Samsul Mu'arif

Web & Mobile Developer

Artikel Terkait

Lihat semua