m.techreview.click
  • Website
  • Indonesia
  • Hosting
  • Laravel
  • Bisnis
  • Development
No Result
View All Result
m.techreview.click
  • Website
  • Indonesia
  • Hosting
  • Laravel
  • Bisnis
  • Development
No Result
View All Result
m.techreview.click
No Result
View All Result
Home Contoh

Laravel Eloquent Relationship One to Many: Contoh Kode dan Penjelasan Relasi

Seraphina by Seraphina
June 1, 2025
in Contoh, Eloquent, Kode, Laravel, Relasi
0
Share on FacebookShare on Twitter

Laravel Eloquent ORM adalah kekuatan utama di balik kemudahan berinteraksi dengan database dalam aplikasi Laravel. Salah satu fitur paling berguna dari Eloquent adalah kemampuannya untuk mendefinisikan relasi antar tabel database. Artikel ini akan membahas secara mendalam tentang relasi one-to-many (satu-ke-banyak) di Laravel Eloquent, lengkap dengan contoh kode dan penjelasan yang mudah dipahami. Jadi, mari kita mulai perjalanan kita untuk memahami relasi one-to-many di Laravel!

Apa itu Relasi One-to-Many di Laravel Eloquent?

Relasi one-to-many (satu-ke-banyak) adalah jenis relasi database di mana satu baris di tabel A berhubungan dengan banyak baris di tabel B. Contoh klasiknya adalah relasi antara penulis (Author) dan postingan (Post). Seorang penulis dapat memiliki banyak postingan, tetapi setiap postingan hanya dimiliki oleh satu penulis.

Dalam konteks Laravel Eloquent, ini berarti satu model (misalnya, Author) dapat memiliki banyak model lain (misalnya, Post). Kita akan mendefinisikan relasi ini di dalam model Eloquent kita sehingga kita dapat dengan mudah mengambil dan memanipulasi data yang terkait.

Struktur Database untuk Relasi One-to-Many: Studi Kasus Penulis dan Postingan

Sebelum kita masuk ke kode, penting untuk memahami struktur database yang dibutuhkan untuk relasi one-to-many. Mari kita gunakan contoh penulis dan postingan. Kita akan memerlukan dua tabel:

Related Post

Belajar Web Development dengan Framework React: Panduan Lengkap untuk Frontend Developer

August 11, 2025

Tutorial Web Development Dasar untuk Pemula: Langkah Demi Langkah Menjadi Web Developer

August 11, 2025

Cara Migrasi Website ke Hosting Baru Tanpa Downtime: Panduan Praktis

August 5, 2025

Belajar Laravel dari Dasar Hingga Mahir Bahasa Indonesia: Menjadi Expert Laravel

August 5, 2025
  • authors: Menyimpan informasi tentang penulis. Kolom-kolomnya mungkin mencakup id, name, email, dan created_at/updated_at.
  • posts: Menyimpan informasi tentang postingan. Kolom-kolomnya mungkin mencakup id, author_id, title, body, dan created_at/updated_at.

Kunci penting di sini adalah kolom author_id di tabel posts. Kolom ini adalah foreign key yang menunjuk ke id di tabel authors. Ini adalah penghubung yang membangun relasi one-to-many. Setiap postingan memiliki author_id yang menunjukkan siapa penulisnya.

Berikut adalah contoh migration untuk membuat tabel-tabel ini:

// database/migrations/xxxx_xx_xx_create_authors_table.php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreateAuthorsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('authors', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamps();
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('authors');
    }
}
// database/migrations/xxxx_xx_xx_create_posts_table.php

use IlluminateDatabaseMigrationsMigration;
use IlluminateDatabaseSchemaBlueprint;
use IlluminateSupportFacadesSchema;

class CreatePostsTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('posts', function (Blueprint $table) {
            $table->id();
            $table->unsignedBigInteger('author_id');
            $table->string('title');
            $table->text('body');
            $table->timestamps();

            $table->foreign('author_id')->references('id')->on('authors')->onDelete('cascade'); // Penting untuk foreign key constraint
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::dropIfExists('posts');
    }
}

Penjelasan Kode Migration:

  • Schema::create('authors', function (Blueprint $table) { ... }); Membuat tabel bernama authors.
  • $table->id(); Membuat kolom id sebagai primary key (auto-incrementing integer).
  • $table->string('name'); Membuat kolom name bertipe string.
  • $table->string('email')->unique(); Membuat kolom email bertipe string dan memastikan nilainya unik.
  • $table->timestamps(); Membuat kolom created_at dan updated_at untuk mencatat waktu pembuatan dan pembaruan data.
  • $table->unsignedBigInteger('author_id'); Membuat kolom author_id sebagai unsigned big integer (sesuai dengan tipe data id di tabel authors).
  • $table->text('body'); Membuat kolom body bertipe text (untuk menyimpan konten postingan yang lebih panjang).
  • $table->foreign('author_id')->references('id')->on('authors')->onDelete('cascade'); Ini adalah kunci! Ini mendefinisikan foreign key constraint. Ini berarti:
    • $table->foreign('author_id'): author_id adalah foreign key.
    • references('id'): author_id merujuk ke kolom id di tabel…
    • on('authors'): …tabel authors.
    • onDelete('cascade'): Ini sangat penting! Jika seorang penulis dihapus (didelete), semua postingan yang terkait dengan penulis tersebut juga akan dihapus secara otomatis. Ini memastikan integritas data. Pilihan lain adalah onDelete('set null'), yang akan mengatur author_id di postingan menjadi NULL jika penulis dihapus.

Setelah membuat migration, jalankan php artisan migrate untuk membuat tabel di database Anda.

Mendefinisikan Relasi di Model Eloquent: HasMany dan BelongsTo

Sekarang kita memiliki struktur database yang benar, kita perlu mendefinisikan relasi di model Eloquent kita. Kita akan memiliki dua model: Author dan Post.

// app/Models/Author.php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class Author extends Model
{
    use HasFactory;

    protected $fillable = ['name', 'email']; // Kolom yang boleh diisi

    public function posts()
    {
        return $this->hasMany(Post::class);
    }
}
// app/Models/Post.php

namespace AppModels;

use IlluminateDatabaseEloquentFactoriesHasFactory;
use IlluminateDatabaseEloquentModel;

class Post extends Model
{
    use HasFactory;

    protected $fillable = ['author_id', 'title', 'body']; // Kolom yang boleh diisi

    public function author()
    {
        return $this->belongsTo(Author::class);
    }
}

Penjelasan Kode Model:

  • $fillable = ['name', 'email']; (di model Author) dan $fillable = ['author_id', 'title', 'body']; (di model Post) adalah mass assignment protection. Ini menentukan kolom mana yang boleh diisi ketika kita membuat atau memperbarui model menggunakan array. Penting untuk melindungi aplikasi Anda dari kerentanan mass assignment.
  • public function posts() (di model Author): Ini mendefinisikan relasi one-to-many dari perspektif penulis. Ini menggunakan method hasMany().
    • return $this->hasMany(Post::class); Ini berarti: “Seorang penulis memiliki banyak postingan.”
    • Parameter Post::class menunjukkan model yang terkait (dalam hal ini, Post).
  • public function author() (di model Post): Ini mendefinisikan relasi kebalikan dari perspektif postingan. Ini menggunakan method belongsTo().
    • return $this->belongsTo(Author::class); Ini berarti: “Sebuah postingan termasuk ke seorang penulis.”
    • Parameter Author::class menunjukkan model yang terkait (dalam hal ini, Author).

Penting: Eloquent secara otomatis mengasumsikan bahwa kolom foreign key di tabel posts adalah author_id (nama model Author dalam snake case diikuti dengan _id). Jika Anda menggunakan nama kolom yang berbeda, Anda perlu menentukannya sebagai parameter kedua di method hasMany() dan belongsTo(). Misalnya, jika kolom foreign key Anda bernama penulis_id, Anda akan menggunakan:

// app/Models/Author.php
public function posts()
{
    return $this->hasMany(Post::class, 'penulis_id');
}

// app/Models/Post.php
public function author()
{
    return $this->belongsTo(Author::class, 'penulis_id');
}

Contoh Kode Penggunaan Relasi One-to-Many

Sekarang kita telah mendefinisikan relasi, mari kita lihat beberapa contoh cara menggunakannya:

1. Mengambil Semua Postingan dari Seorang Penulis:

$author = Author::find(1); // Misalnya, ambil penulis dengan ID 1

$posts = $author->posts; // Mengakses relasi "posts"

foreach ($posts as $post) {
    echo $post->title . "<br>";
}

Kode ini pertama-tama mengambil penulis dengan ID 1. Kemudian, ia mengakses relasi posts melalui properti $author->posts. Ini mengembalikan collection dari semua model Post yang terkait dengan penulis tersebut. Kita kemudian dapat melakukan iterasi melalui collection ini untuk mengakses atribut postingan.

2. Mengambil Penulis dari Sebuah Postingan:

$post = Post::find(5); // Misalnya, ambil postingan dengan ID 5

$author = $post->author; // Mengakses relasi "author"

echo $author->name;

Kode ini mengambil postingan dengan ID 5. Kemudian, ia mengakses relasi author melalui properti $post->author. Ini mengembalikan model Author yang memiliki postingan tersebut.

3. Membuat Postingan Baru untuk Seorang Penulis:

$author = Author::find(1);

$post = new Post([
    'title' => 'Judul Postingan Baru',
    'body' => 'Isi postingan baru...'
]);

$author->posts()->save($post); // Menggunakan method "save" untuk relasi

Kode ini pertama-tama mengambil penulis dengan ID 1. Kemudian, ia membuat instance baru dari model Post dan mengisi atribut title dan body. Yang penting di sini adalah kita menggunakan method save() pada relasi posts() daripada memanggil save() langsung pada model Post. Ini secara otomatis akan mengatur author_id di postingan ke ID penulis.

Alternatif yang lebih ringkas menggunakan create():

$author = Author::find(1);

$author->posts()->create([
    'title' => 'Judul Postingan Baru',
    'body' => 'Isi postingan baru...'
]);

Method create() melakukan hal yang sama seperti save() tetapi lebih ringkas karena tidak memerlukan pembuatan instance model Post secara manual.

4. Eager Loading: Meningkatkan Performa dengan Mengurangi Query Database

Secara default, saat Anda mengakses relasi, Eloquent akan menjalankan query database terpisah untuk setiap relasi. Ini bisa menjadi masalah performa jika Anda memuat banyak model dan relasi. Eager loading memungkinkan Anda untuk memuat relasi bersama dengan model utama dalam satu query database, secara signifikan mengurangi jumlah query.

$authors = Author::with('posts')->get(); // Eager load relasi "posts"

foreach ($authors as $author) {
    echo $author->name . "<br>";
    foreach ($author->posts as $post) {
        echo "- " . $post->title . "<br>";
    }
}

Kode ini menggunakan method with('posts') untuk menentukan bahwa kita ingin memuat relasi posts bersama dengan model Author. Ini berarti hanya ada dua query database: satu untuk mengambil semua penulis, dan satu untuk mengambil semua postingan yang terkait dengan penulis-penulis tersebut. Tanpa eager loading, akan ada satu query untuk mengambil semua penulis, dan kemudian satu query untuk setiap penulis untuk mengambil postingannya.

Anda juga dapat melakukan eager load beberapa relasi:

$authors = Author::with(['posts', 'profile'])->get(); // Eager load "posts" dan "profile"

5. Constraining Eager Loads: Memfilter Relasi yang Dimuat

Anda dapat memfilter relasi yang dimuat menggunakan callback ke method with():

$authors = Author::with(['posts' => function ($query) {
    $query->where('title', 'like', '%Laravel%');
}])->get();

foreach ($authors as $author) {
    echo $author->name . "<br>";
    foreach ($author->posts as $post) {
        echo "- " . $post->title . "<br>"; // Hanya postingan dengan judul yang mengandung "Laravel"
    }
}

Kode ini hanya akan memuat postingan yang judulnya mengandung kata “Laravel”. Ini berguna untuk memfilter data terkait berdasarkan kriteria tertentu.

Relasi One-to-Many Polymorphic

Laravel juga mendukung relasi one-to-many polymorphic. Ini memungkinkan satu model untuk berelasi dengan banyak model lain pada satu relasi. Contohnya adalah sistem komentar di mana komentar dapat dilampirkan ke postingan, video, atau artikel.

Untuk mengimplementasikannya, Anda akan memerlukan kolom commentable_id dan commentable_type di tabel comments. commentable_id akan berisi ID dari model yang dikomentari, dan commentable_type akan berisi nama kelas model yang dikomentari (misalnya, AppModelsPost, AppModelsVideo, AppModelsArticle).

Berikut adalah contoh cara mendefinisikan relasi ini di model:

// app/Models/Comment.php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Comment extends Model
{
    public function commentable()
    {
        return $this->morphTo();
    }
}
// app/Models/Post.php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Post extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}
// app/Models/Video.php

namespace AppModels;

use IlluminateDatabaseEloquentModel;

class Video extends Model
{
    public function comments()
    {
        return $this->morphMany(Comment::class, 'commentable');
    }
}

Kita menggunakan method morphTo() di model Comment untuk mendefinisikan relasi polymorphic. Dan kita menggunakan method morphMany() di model Post dan Video untuk mendefinisikan relasi one-to-many polymorphic.

Kesimpulan: Memahami dan Memanfaatkan Relasi One-to-Many di Laravel Eloquent

Relasi one-to-many adalah fondasi penting dalam membangun aplikasi Laravel yang kompleks dengan database relasional. Dengan memahami cara mendefinisikan dan menggunakan relasi ini di Laravel Eloquent, Anda dapat dengan mudah mengambil dan memanipulasi data yang terkait, serta meningkatkan performa aplikasi Anda dengan eager loading. Contoh kode dan penjelasan di atas memberikan dasar yang kuat untuk mulai memanfaatkan kekuatan relasi one-to-many dalam proyek Laravel Anda. Jangan ragu untuk bereksperimen dengan berbagai opsi dan konfigurasi untuk menemukan yang paling sesuai dengan kebutuhan aplikasi Anda. Selamat mencoba!

Sumber Terpercaya

  • Laravel Documentation: Eloquent Relationships

Semoga artikel ini bermanfaat!

Tags: Code ExampleDatabaseEloquentLaravelModelOne-to-ManyPHPRelasiRelationshiptutorial
Seraphina

Seraphina

Related Posts

Belajar

Belajar Web Development dengan Framework React: Panduan Lengkap untuk Frontend Developer

by venus
August 11, 2025
Dasar

Tutorial Web Development Dasar untuk Pemula: Langkah Demi Langkah Menjadi Web Developer

by Seraphina
August 11, 2025
Hosting

Cara Migrasi Website ke Hosting Baru Tanpa Downtime: Panduan Praktis

by Elara
August 5, 2025
Next Post

Aplikasi AI untuk Membantu Menulis Artikel Bahasa Indonesia: Tool Praktis

Leave a Reply Cancel reply

Your email address will not be published. Required fields are marked *

Recommended

No Content Available

Tips Memilih Web Developer yang Kompeten: Kriteria dan Pertimbangan Penting

August 11, 2025

Contoh Project Web Development Sederhana dengan HTML CSS JS: Latihan Praktis untuk Pemula

August 11, 2025

Belajar Web Development dengan Framework React: Panduan Lengkap untuk Frontend Developer

August 11, 2025

Tutorial Web Development Dasar untuk Pemula: Langkah Demi Langkah Menjadi Web Developer

August 11, 2025

m.techreview.click

Our media platform offers reliable news and insightful articles. Stay informed with our comprehensive coverage and in-depth analysis on various topics.
Read more »

Recent Posts

  • Tips Memilih Web Developer yang Kompeten: Kriteria dan Pertimbangan Penting
  • Contoh Project Web Development Sederhana dengan HTML CSS JS: Latihan Praktis untuk Pemula
  • Belajar Web Development dengan Framework React: Panduan Lengkap untuk Frontend Developer

Categories

  • 2024
  • Admin
  • Agency
  • AI
  • Akses
  • Aktif
  • Akuntansi
  • Algoritma
  • Analisis
  • Anggaran
  • Antarmuka
  • Antisipasi
  • API
  • Aplikasi
  • Artikel
  • Asynchronous
  • Audio
  • Authentication
  • Authorization
  • Backend
  • Background
  • Backup
  • Bahasa
  • Bandwidth
  • Bantuan
  • Belajar
  • Bergabung
  • Biaya
  • Bisnis
  • Blog
  • Blogger
  • Bootstrap
  • Branding
  • Budget
  • Bukti
  • Cepat
  • Chatbot
  • Cloud
  • Coding
  • Company
  • Contoh
  • cPanel
  • CRM
  • CRUD
  • CSS
  • Custom
  • Dampak
  • Dasar
  • Dashboard
  • Data
  • Database
  • Deployment
  • Desain
  • Design
  • Detail
  • Developer
  • Development
  • Digital
  • Diskusi
  • Dokumentasi
  • Domain
  • Download
  • Dukungan
  • E-commerce
  • Efektif
  • Efisiensi
  • Elementor
  • Eloquent
  • Email
  • Engine
  • Enterprise
  • Error
  • Error generating categories
  • Estimasi
  • Etika
  • Event
  • Faktor
  • Fitur
  • Fleksibel
  • Fortify
  • Foto
  • Framework
  • Freelance
  • Freelancer
  • Fresh
  • Frontend
  • Fungsi
  • Gambar
  • Garansi
  • Gratis
  • Hacker
  • Harga
  • Hemat
  • Here are 5 categories derived from the article title "Hosting dengan Dukungan Pelanggan 24 Jam: Bantuan Kapanpun Dibutuhkan": Hosting
  • Here are 5 categories derived from the article title "Hosting Domain Murah Indonesia dengan Proteksi DDoS Gratis: Solusi Terbaik untuk Website Anda": Hosting
  • Here are 5 categories derived from the article title "Hosting VPS Murah untuk Developer Indonesia: Fleksibilitas dan Kontrol Penuh": Hosting
  • Here are 5 categories derived from the provided list and the article titles: Company
  • Hosting
  • HTML
  • Hybrid
  • Implementasi
  • Indonesia
  • Inovasi
  • Inspirasi
  • Instalasi
  • Integrasi
  • Interaktif
  • Internasional
  • Investasi
  • Jakarta
  • Jasa
  • JavaScript
  • Kampanye
  • Kantor
  • Kapasitas
  • Karir
  • Karyawan
  • Keamanan
  • Keandalan
  • Keberhasilan
  • Kebutuhan
  • Kecepatan
  • Kecil
  • Kehidupan
  • Kemampuan
  • Kemudahan
  • Kerja
  • Kesalahan
  • Kesehatan
  • Keterampilan
  • Keuntungan
  • Keyword
  • Klien
  • Kode
  • Kompetensi
  • Komponen
  • Komunikasi
  • Komunitas
  • Koneksi
  • Konfigurasi
  • Konsep
  • Konten
  • Konversi
  • Kreativitas
  • Kredibilitas
  • Kriteria
  • Kualitas
  • Kurikulum
  • Langkah
  • Laravel
  • Latihan
  • Layanan
  • Lengkap
  • Library
  • Listener
  • Livewire
  • Logika
  • Logo
  • Lokal
  • Loyalitas
  • Machine Learning
  • Mahasiswa
  • Mahir
  • Maintenance
  • Manajemen
  • Manfaat
  • Manufaktur
  • Marketing
  • Masa Depan
  • Masyarakat
  • Media Sosial
  • Medis
  • Memilih
  • Menarik
  • Meningkatkan
  • Metrik
  • Middleware
  • Migration
  • Mobile
  • Modern
  • Murah
  • MySQL
  • Node.js
  • Observer
  • Online
  • Operasional
  • Optimasi
  • ORM
  • Otentikasi
  • Otomatis
  • Otomatisasi
  • Package
  • Panduan
  • Pasar
  • Pekerjaan
  • Pelajaran
  • Pelanggan
  • Pelatihan
  • Peluang
  • Pemahaman
  • Pemanfaatan
  • Pemasaran
  • Pembayaran
  • Pembuatan
  • Pemilihan
  • Pemrograman
  • Pemula
  • Penawaran
  • Pengalaman
  • Pengantar
  • Pengenalan
  • Pengguna
  • Penggunaan
  • Pengujian
  • Pengukuran
  • Penipuan
  • Penjualan
  • Penulisan
  • Penyimpanan
  • Peran
  • Perbandingan
  • Perbedaan
  • Performa
  • Performance
  • Peringkat
  • Pertimbangan
  • Pertumbuhan
  • Perusahaan
  • PHP
  • Pilihan
  • Platform
  • Policy
  • Portofolio
  • Potensi
  • Praktik
  • Praktis
  • Prediksi
  • Pribadi
  • Process
  • Produktivitas
  • Profesional
  • Profil
  • Profile
  • Project
  • Promosi
  • Proses
  • Proyek
  • Python
  • Queue
  • React
  • Real-Time
  • Redis
  • Referensi
  • Rekomendasi
  • Relasi
  • Relevansi
  • Remote
  • Request
  • Responsive
  • Responsive Design
  • Retail
  • Retensi
  • Review
  • Riset
  • Ritel
  • Roadmap
  • Saham
  • Sanctum
  • Sederhana
  • Seeding
  • Sehari-hari
  • SEO
  • Sertifikat
  • Server
  • Sharing
  • Sinkronisasi
  • Sistem
  • Skalabilitas
  • Skill
  • Software
  • Solusi
  • Space
  • SSL
  • Startup
  • Strategi
  • Struktur
  • Studi Kasus
  • Sukses
  • Tampilan
  • Tanggung Jawab
  • Tantangan
  • Teknis
  • Teknologi
  • Teks
  • Template
  • Tenaga Kerja
  • Terbaik
  • Terjangkau
  • Terjemahan
  • Terlengkap
  • Terpercaya
  • Terstruktur
  • Tim
  • Tips
  • Toko
  • Tools
  • Training
  • Transaksi
  • Transkripsi
  • Tren
  • Trik
  • Troubleshooting
  • Tugas
  • Tutorial
  • Uji Coba
  • UKM
  • UMKM
  • Umum
  • Unlimited
  • Uptime
  • URL
  • User Experience
  • User-Friendly
  • Video
  • Visual
  • VPS
  • Vue.js
  • Wajah
  • Web
  • Web Development
  • Website
  • WHM
  • Windows
  • WordPress
  • XAMPP

Resource

  • About us
  • Contact Us
  • Privacy Policy

© 2024 m.techreview.click.

No Result
View All Result
  • Website
  • Indonesia
  • Hosting
  • Laravel
  • Bisnis
  • Development

© 2024 m.techreview.click.