Laprak 8 — Laravel Relationship

Pemrograman Web Pertemuan 8 Zahran Azaria Anvaya - 2411531005

I. Tujuan Praktikum

Setelah menyelesaikan praktikum ini, mahasiswa diharapkan mampu:

  • Memahami konsep relationship dalam Laravel (One-to-Many dan Many-to-Many)
  • Membuat migration dengan foreign key dan tabel pivot
  • Mengimplementasikan Eloquent relationship pada Model
  • Menggunakan eager loading untuk menghindari N+1 problem
  • Menampilkan data relationship di view menggunakan Blade
  • Mengimplementasikan relasi One-to-One untuk fitur tambahan (jadwal mata kuliah)

II. Dasar Teori

Relationship dalam Laravel adalah fitur Eloquent ORM yang memungkinkan model saling terhubung satu sama lain sesuai relasi di database. Terdapat beberapa jenis relationship yang umum digunakan, antara lain One-to-One (satu data memiliki tepat satu data lain), One-to-Many (satu data memiliki banyak data lain), dan Many-to-Many (banyak data berhubungan dengan banyak data lain melalui tabel pivot).

Pada praktikum ini dibuat sistem akademik sederhana dengan tiga entitas utama: Major (jurusan), Student (mahasiswa), dan Subject (mata kuliah). Major memiliki banyak Student (One-to-Many), sedangkan Student dan Subject memiliki relasi Many-to-Many melalui tabel pivot student_subject. Pada bagian challenge, ditambahkan entitas Jadwal yang berelasi One-to-One dengan Subject.

RelationshipDariKeMethod Eloquent
One-to-ManyMajorStudenthasMany()
Many-to-OneStudentMajorbelongsTo()
Many-to-ManyStudentSubjectbelongsToMany()
Many-to-ManySubjectStudentbelongsToMany()
One-to-OneSubjectJadwalhasOne()
One-to-OneJadwalSubjectbelongsTo()

III. Alat dan Bahan

  • Laptop / Komputer
  • XAMPP / Laragon
  • Visual Studio Code
  • Browser (Google Chrome / Firefox)
  • Project Laravel (dari praktikum sebelumnya)

IV. Langkah - Langkah Praktikum

1Membuat Migration

Buat 4 file migration untuk tabel majors, students, subjects, dan tabel pivot student_subject. Masing-masing dibuat dengan perintah php artisan make:migration.

Migration: majors

Buat file migration untuk tabel major dengan perintah php artisan make:migration create_majors_table.

Migration tabel majors
Gambar 1 – Migration Tabel Majors

Tabel majors hanya memiliki kolom id, name, dan timestamps.

Migration tabel majors
Gambar 1 – Isi File Migration Tabel Majors
Migration: students

Buat file migration untuk tabel student dengan perintah php artisan make:migration create_students_table.

Migration tabel students
Gambar 2 – Migration Tabel Students

Tabel students memiliki kolom nim (unique), name, address, dan major_id sebagai foreign key ke tabel majors dengan cascade delete.

Migration tabel students
Gambar 2 – Isi File Migration Tabel Students
Migration: subjects

Buat file migration untuk tabel subject dengan perintah php artisan make:migration create_subjects_table.

Migration tabel subjects
Gambar 3 – Migration Tabel Subjects

Tabel subjects memiliki kolom id (unique), name, dan sks.

Migration tabel subjects
Gambar 3 – Isi File Migration Tabel Subjects
Migration: student_subject (pivot)

Buat file migration untuk tabel student_subject dengan perintah php artisan make:migration create_student_subject_table.

Migration tabel pivot student_subject
Gambar 4 – Migration Tabel Pivot Student_Subject

Tabel pivot student_subject menghubungkan Student dan Subject melalui student_id dan subject_id sebagai foreign key. Kombinasi keduanya dibuat unique untuk mencegah duplikasi data.

Migration tabel pivot student_subject
Gambar 4 – Isi Migration Tabel Pivot Student_Subject

Setelah semua file migration selesai, jalankan php artisan migrate untuk membuat seluruh tabel di database.

Hasil php artisan migrate
Gambar 5 – Hasil php artisan migrate
2Membuat Model dengan Relationship

Dibuat tiga model: Major, Student, dan Subject. Masing-masing model dilengkapi dengan method relationship Eloquent.

Model: Major

Buat file model untuk Major dengan perintah php artisan make:model Major.

Model Major.php
Gambar 6 – Model Major.php

Model Major memiliki method students() dengan hasMany(Student::class) yang menyatakan bahwa satu jurusan memiliki banyak mahasiswa.

Model Major.php
Gambar 6 – Isi File Model Major.php
Model: Student

Buat file model untuk Student dengan perintah php artisan make:model Student.

Model Student.php
Gambar 7 – Model Student.php

Model Student memiliki dua relationship: major() dengan belongsTo(Major::class) untuk relasi ke jurusan, dan subjects() dengan belongsToMany(Subject::class) untuk relasi Many-to-Many ke mata kuliah.

Model Student.php
Gambar 7 – Isi File Model Student.php
Model: Subject

Buat file model untuk Subject dengan perintah php artisan make:model Subject.

Model Subject.php
Gambar 8 – Model Subject.php

Model Subject memiliki method students() dengan belongsToMany(Student::class) sebagai sisi lain dari relasi Many-to-Many.

Model Subject.php
Gambar 8 – Isi File Model Subject.php
3Membuat Seeder

Dibuat tiga seeder untuk mengisi data awal: MajorSeeder, SubjectSeeder, dan StudentSeeder. Urutan pemanggilan seeder penting karena StudentSeeder bergantung pada data Major dan Subject.

MajorSeeder
MajorSeeder.php
Gambar 9 – MajorSeeder.php
SubjectSeeder
SubjectSeeder.php
Gambar 10 – SubjectSeeder.php
StudentSeeder

StudentSeeder mengisi data mahasiswa sekaligus menghubungkan setiap mahasiswa ke beberapa mata kuliah secara acak menggunakan method attach() pada relationship.

StudentSeeder.php
Gambar 11 – StudentSeeder.php
DatabaseSeeder

Ketiga seeder didaftarkan di DatabaseSeeder.php dengan urutan MajorSeeder → SubjectSeeder → StudentSeeder, kemudian dijalankan dengan perintah php artisan db:seed.

DatabaseSeeder.php
Gambar 12 – DatabaseSeeder.php
Hasil php artisan db:seed
Gambar 12 – Hasil php artisan db:seed
4Membuat Controller

Dibuat StudentController dengan method-method CRUD lengkap. Pada method index() dan show() digunakan eager loading dengan Student::with(['major', 'subjects']) untuk menghindari N+1 query problem saat mengakses data relationship.

Method store() menyimpan data mahasiswa baru dan menghubungkannya ke mata kuliah menggunakan attach(). Method update() menggunakan sync() untuk memperbarui relasi Many-to-Many. Method destroy() memanggil detach() terlebih dahulu sebelum menghapus data.

StudentController.php - method index dan show
Gambar 13 – StudentController.php (method index, show, store, update, destroy)
5Membuat Route

Buat Route::resource('students', StudentController::class) yang secara otomatis mendaftarkan semua route CRUD sekaligus. Route / diarahkan ke halaman daftar mahasiswa.

routes/web.php
Gambar 14 – Isi File routes/web.php
6Membuat View

Dibuat layout utama yang menggunakan Bootstrap 5 dengan navbar, kemudian dibuat view untuk halaman daftar mahasiswa, form tambah, dan form edit.

Layout: layouts/student.blade.php

Layout menggunakan Bootstrap 5 dari CDN, dilengkapi navbar dan area untuk menampilkan pesan sukses dari session.

layouts/student.blade.php
Gambar 15 – Layout student.blade.php
View: students/index.blade.php

Halaman index menampilkan tabel daftar mahasiswa lengkap dengan nama jurusan (dari relasi $student->major->name), badge mata kuliah (dari relasi $student->subjects), dan total SKS menggunakan $student->subjects->sum('sks').

students/index.blade.php
Gambar 16 – View students/index.blade.php
View: students/create.blade.php

Form tambah mahasiswa menampilkan dropdown jurusan dan checkbox mata kuliah yang datanya diambil dari database, sehingga form bersifat dinamis.

students/create.blade.php
Gambar 17 – View students/create.blade.php
View: students/edit.blade.php

Form edit mahasiswa mirip dengan form tambah, namun data yang sudah ada ditampilkan sebagai default value. Checkbox mata kuliah yang sudah diambil mahasiswa akan tercentang secara otomatis menggunakan kondisi in_array($subject->id, $student->subjects->pluck('id')->toArray()).

students/edit.blade.php
Gambar 18 – View students/edit.blade.php
View: students/show.blade.php

Halaman detail mahasiswa menampilkan informasi lengkap mahasiswa, termasuk jurusan dan daftar mata kuliah yang diambil beserta SKS masing-masing.

students/show.blade.php
Gambar 19 – View students/show.blade.php
7Menjalankan dan Menguji Aplikasi

Jalankan server dengan php artisan serve kemudian akses http://127.0.0.1:8000/students di browser.

Halaman Daftar Mahasiswa

Halaman index menampilkan seluruh data mahasiswa beserta jurusan, badge mata kuliah, dan total SKS masing-masing.

Tampilan halaman daftar mahasiswa
Gambar 20 – Tampilan Halaman Daftar Mahasiswa (/students)
Tambah Mahasiswa

Klik tombol Tambah Mahasiswa untuk membuka form. Isi NIM, nama, alamat, pilih jurusan dari dropdown, dan centang mata kuliah yang diambil.

Tampilan form tambah mahasiswa
Gambar 21 – Tampilan Form Tambah Mahasiswa (/students/create)

Setelah klik Simpan, halaman kembali ke daftar mahasiswa dan menampilkan pesan sukses bahwa data berhasil ditambahkan.

Tampilan setelah tambah mahasiswa berhasil
Gambar 21b – Tampilan Setelah Mahasiswa Berhasil Ditambahkan
Edit Mahasiswa

Klik tombol Edit untuk membuka form edit. Data lama sudah terisi otomatis di setiap field, dan checkbox mata kuliah yang sudah diambil tercentang secara otomatis.

Tampilan form edit mahasiswa
Gambar 22 – Tampilan Form Edit Mahasiswa (/students/{id}/edit)

Setelah klik Update, halaman kembali ke daftar mahasiswa dan menampilkan pesan sukses bahwa data berhasil diperbarui.

Tampilan setelah edit berhasil
Gambar 22b – Tampilan Setelah Data Berhasil Diperbarui
Hapus Mahasiswa

Klik tombol Hapus pada salah satu mahasiswa. Muncul dialog konfirmasi browser sebelum data benar-benar dihapus.

Dialog konfirmasi hapus mahasiswa
Gambar 23 – Dialog Konfirmasi Hapus Mahasiswa

Setelah konfirmasi, data mahasiswa beserta seluruh relasinya ke mata kuliah dihapus, dan halaman menampilkan pesan sukses dengan daftar mahasiswa yang sudah terupdate.

Tampilan setelah hapus berhasil
Gambar 24 – Tampilan Setelah Data Berhasil Dihapus
Detail Mahasiswa

Klik tombol Detail pada salah satu mahasiswa untuk melihat informasi lengkapnya, termasuk jurusan dan daftar mata kuliah yang diambil beserta SKS masing-masing.

Tampilan halaman detail mahasiswa
Gambar 24 – Tampilan Halaman Detail Mahasiswa (/students/{id})

V. Challenge — Tambahkan Jadwal Mata Kuliah

Challenge: One-to-One Relationship

Menambahkan jadwal untuk setiap mata kuliah menggunakan relasi One-to-One antara Subject dan Jadwal

1Migration Tabel Jadwal

Dibuat migration baru untuk tabel jadwals yang menyimpan informasi jadwal setiap mata kuliah. Tabel ini memiliki subject_id sebagai foreign key ke tabel subjects, serta kolom hari, jam_mulai, jam_selesai, dan ruangan.

Migration tabel jadwal
Gambar 21 – Migration Tabel Jadwal

Jalankan php artisan migrate untuk membuat tabel jadwal di database.

2Model Jadwal dan Update Model Subject

Dibuat model Jadwal dengan method subject() menggunakan belongsTo(Subject::class), menyatakan bahwa satu jadwal milik satu mata kuliah.

Model Jadwal.php
Gambar 22 – Model Jadwal.php

Model Subject diperbarui dengan menambahkan method jadwal() menggunakan hasOne(Jadwal::class), menyatakan bahwa satu mata kuliah memiliki satu jadwal. Inilah implementasi relasi One-to-One.

Update Model Subject.php - tambah hasOne jadwal
Gambar 23 – Update Model Subject.php (tambah relasi hasOne Jadwal)
3Seeder Jadwal

Buat JadwalSeeder untuk mengisi data jadwal awal pada setiap mata kuliah. Setiap mata kuliah mendapatkan satu jadwal dengan informasi hari, jam mulai, jam selesai, dan ruangan.

JadwalSeeder.php
Gambar 24 – JadwalSeeder.php

Daftarkan JadwalSeeder di DatabaseSeeder.php setelah SubjectSeeder karena membutuhkan data subject yang sudah ada. Kemudian dijalankan dengan php artisan db:seed --class=JadwalSeeder.

Daftarkan JadwalSeeder dan jalankan seeder
Gambar 25 – Daftarkan JadwalSeeder dan Jalankan Seeder
4Menambahkan Method Jadwal di Controller dan Route

Tambahkan method jadwal() pada StudentController yang mengambil semua data Subject beserta jadwalnya menggunakan eager loading Subject::with('jadwal')->get(), kemudian mengembalikan view students.jadwal.

Method jadwal() di StudentController
Gambar 26 – Method jadwal() di StudentController

Tambahkan route baru GET /jadwal di routes/web.php yang mengarah ke method jadwal() pada StudentController.

Tambah route /jadwal di web.php
Gambar 27 – Tambah Route /jadwal di web.php
5Membuat View Jadwal

Buat file resources/views/students/jadwal.blade.php yang menampilkan tabel jadwal seluruh mata kuliah. Data jadwal diakses melalui relasi One-to-One menggunakan $subject->jadwal->hari, $subject->jadwal->jam_mulai, dan seterusnya. Jika mata kuliah belum memiliki jadwal, ditampilkan teks "Belum ada jadwal".

students/jadwal.blade.php
Gambar 28 – View students/jadwal.blade.php

Akses halaman jadwal di browser melalui http://127.0.0.1:8000/jadwal.

Tampilan halaman jadwal mata kuliah
Gambar 29 – Tampilan Halaman Jadwal Mata Kuliah

VI. Latihan — Query dengan Relationship

Pada bagian latihan ini, dibuat 4 query menggunakan Eloquent relationship yang diimplementasikan sebagai method baru di StudentController dan ditampilkan melalui satu view students/latihan.blade.php.

1Menambahkan Method Latihan di Controller

Ditambahkan method latihan() pada StudentController.php yang berisi 4 query sekaligus. Query pertama mengambil semua mahasiswa beserta jurusan dan mata kuliahnya menggunakan Student::with(['major', 'subjects'])->get(). Query kedua mencari jurusan dengan mahasiswa terbanyak menggunakan Major::withCount('students')->orderBy('students_count', 'desc')->first(). Query ketiga mengambil mata kuliah mahasiswa tertentu melalui relasi $student->subjects. Query keempat menghitung total SKS setiap mahasiswa menggunakan $student->subjects->sum('sks').

Method latihan() di StudentController
Gambar L1 – Method latihan() di StudentController.php
2Menambahkan Route Latihan

Ditambahkan route baru GET /latihan di routes/web.php yang mengarah ke method latihan() pada StudentController. Route ini ditempatkan sebelum Route::resource agar tidak tertimpa oleh route resource.

Tambah route /latihan di web.php
Gambar L2 – Tambah Route /latihan di web.php
3Membuat View Latihan

Buat file resources/views/students/latihan.blade.php yang menampilkan hasil keempat query dalam satu halaman, masing-masing dalam section terpisah.

Query 1 - Semua Mahasiswa beserta Jurusan dan Mata Kuliah

Menampilkan tabel yang memuat NIM, nama, jurusan (dari $student->major->name), dan daftar mata kuliah dalam badge (dari $student->subjects).

Query 2 - Jurusan dengan Mahasiswa Terbanyak

Menampilkan nama jurusan dan jumlah mahasiswanya menggunakan $majorTerbanyak->name dan $majorTerbanyak->students_count.

Query 3 - Mata Kuliah Mahasiswa Tertentu

Menampilkan daftar mata kuliah yang diambil oleh mahasiswa tertentu menggunakan $matkul yang dikirim dari controller.

Query 4 - Total SKS Setiap Mahasiswa

Menampilkan tabel nama mahasiswa beserta total SKS yang diambil menggunakan $student->subjects->sum('sks').

Isi file students/latihan.blade.php
Gambar L3 – Isi File students/latihan.blade.php
4Hasil Query di Browser

Akses http://127.0.0.1:8000/latihan di browser untuk melihat hasil keempat query ditampilkan dalam satu halaman.

Query 1 - Semua Mahasiswa beserta Jurusan dan Mata Kuliah

Menampilkan seluruh data mahasiswa lengkap dengan nama jurusan dan badge mata kuliah yang diambil masing-masing mahasiswa.

Hasil query 1 di browser
Gambar L4 – Hasil Query 1: Semua Mahasiswa beserta Jurusan dan Mata Kuliah
Query 2 - Jurusan dengan Mahasiswa Terbanyak

Menampilkan nama jurusan yang memiliki jumlah mahasiswa paling banyak beserta angkanya.

Hasil query 2 di browser
Gambar L5 – Hasil Query 2: Jurusan dengan Mahasiswa Terbanyak
Query 3 - Mata Kuliah Mahasiswa Tertentu

Menampilkan daftar mata kuliah beserta SKS yang diambil oleh mahasiswa dengan id tertentu.

Hasil query 3 di browser
Gambar L6 – Hasil Query 3: Mata Kuliah Mahasiswa Tertentu
Query 4 - Total SKS Setiap Mahasiswa

Menampilkan tabel nama seluruh mahasiswa beserta total SKS yang diambil masing-masing.

Hasil query 4 di browser
Gambar L7 – Hasil Query 4: Total SKS Setiap Mahasiswa

VII. Hasil & Pembahasan

Praktikum ini berhasil mengimplementasikan tiga jenis relationship Eloquent pada Laravel: One-to-Many antara Major dan Student, Many-to-Many antara Student dan Subject melalui tabel pivot student_subject, serta One-to-One antara Subject dan Jadwal pada bagian challenge. Penggunaan eager loading dengan with() terbukti efisien karena menghindari query berulang saat mengakses data relationship di view.

Method attach() digunakan saat menambah data baru untuk menghubungkan mahasiswa ke mata kuliah, sync() digunakan saat update agar data pivot selalu sesuai dengan pilihan terbaru, dan detach() digunakan sebelum delete untuk membersihkan data pivot terlebih dahulu. Pada relasi One-to-One, akses data dilakukan melalui $subject->jadwal yang otomatis menjalankan query ke tabel jadwals.

MethodFungsiDigunakan pada
attach()Menambah relasi Many-to-Manystore()
sync()Memperbarui relasi (hapus lama, tambah baru)update()
detach()Menghapus semua relasidestroy()
with()Eager loading relationshipindex(), show(), jadwal()
hasOne()Relasi One-to-One dari sisi indukSubject → Jadwal
belongsTo()Relasi One-to-One dari sisi anakJadwal → Subject

VIII. Kesimpulan

Berdasarkan praktikum yang telah dilakukan, dapat disimpulkan bahwa:

  1. Relationship One-to-Many diimplementasikan menggunakan hasMany() pada sisi induk dan belongsTo() pada sisi anak.
  2. Relationship Many-to-Many diimplementasikan menggunakan belongsToMany() pada kedua model yang terlibat, dengan tabel pivot sebagai penghubung.
  3. Relationship One-to-One diimplementasikan menggunakan hasOne() pada sisi induk dan belongsTo() pada sisi anak, digunakan untuk menghubungkan Subject dengan Jadwal.
  4. Foreign key dan unique constraint pada tabel pivot berhasil menjaga integritas data relationship di database.
  5. Eager loading dengan with() efektif mencegah N+1 query problem saat mengakses data relationship.
  6. Method attach(), sync(), dan detach() memudahkan pengelolaan data pada relasi Many-to-Many.
Semua langkah berhasil dijalankan dan relationship antar tabel berfungsi dengan benar, termasuk challenge One-to-One untuk jadwal mata kuliah.
Lihat Repository GitHub