Kembali ke Laporan

Laprak 8 — Laravel Relationship: Student, Major, Subject & Jadwal

Pemrograman Web · Pertemuan 8

Saskia Alifah 2411531002 Pemrograman Web Laravel Eloquent Relationship

Setelah menyelesaikan praktikum ini, mahasiswa diharapkan mampu:

  • Memahami konsep dan jenis-jenis Relationship dalam Laravel Eloquent ORM.
  • Mengimplementasikan relasi One-to-Many antara tabel majors dan students.
  • Mengimplementasikan relasi Many-to-Many antara tabel students dan subjects melalui tabel pivot.
  • Membuat Migration dengan foreign key dan constraint referensial.
  • Menggunakan Eager Loading untuk menghindari N+1 query problem.
  • Menampilkan data relasi di View Blade secara dinamis.
  • Mengimplementasikan fitur CRUD lengkap menggunakan Resource Controller.

Laravel Eloquent Relationship adalah fitur ORM bawaan Laravel yang memungkinkan developer mendefinisikan hubungan antar tabel database secara elegan di dalam kelas Model, sehingga query data relasional menjadi lebih mudah dan ekspresif.

One-to-Many (hasMany / belongsTo): Relasi di mana satu record di tabel A dapat berelasi dengan banyak record di tabel B. Contoh: satu Jurusan (Major) memiliki banyak Mahasiswa (Student). Di sisi model Major digunakan hasMany(), sedangkan di model Student digunakan belongsTo().

Many-to-Many (belongsToMany): Relasi di mana banyak record di tabel A berelasi dengan banyak record di tabel B, dihubungkan oleh tabel pivot. Contoh: satu Mahasiswa dapat mengambil banyak Mata Kuliah, dan satu Mata Kuliah dapat diambil oleh banyak Mahasiswa. Kedua model menggunakan metode belongsToMany() dan tabel pivot student_subject menampung kombinasi kunci asingnya.

Eager Loading (with()): Teknik pemuatan data relasi secara sekaligus dalam satu query SQL yang efisien untuk menghindari masalah N+1, di mana N+1 query terjadi ketika setiap record induk melakukan query tambahan untuk mengambil data relasinya secara terpisah.

Pivot Table: Tabel perantara khusus tanpa Primary Key entitas sendiri yang hanya berisi pasangan foreign key dari dua tabel yang berelasi Many-to-Many. Konvensi penamaan Laravel menggunakan nama kedua tabel dalam urutan alfabet, dipisah underscore (contoh: student_subject).

Foreign Key Constraint: Aturan integritas referensial di level database yang memastikan nilai di kolom foreign key selalu merujuk pada data yang valid di tabel induknya. Opsi onDelete('cascade') akan menghapus data anak secara otomatis ketika data induk dihapus.

  • Laptop / Komputer dengan sistem operasi Windows
  • Laragon Full (Local Development Environment — Apache & MySQL)
  • Visual Studio Code (Code Editor)
  • Web Browser (Google Chrome / Mozilla Firefox)
  • Composer (Dependency Manager PHP)
  • Project Laravel yang sudah terbuat di C:/laragon/www/laravel
  • phpMyAdmin untuk verifikasi struktur database

Berikut adalah runtutan langkah praktikum untuk membangun sistem manajemen akademik mahasiswa dengan relasi antar tabel menggunakan Eloquent ORM Laravel.

1Membuat File Migration untuk Semua Tabel

Migration adalah fitur Laravel yang berfungsi sebagai version control skema database. Kita membuat 4 file migration sekaligus: untuk tabel majors, students, subjects, dan tabel pivot student_subject. Urutan pembuatan penting karena tabel yang direferensi foreign key harus ada terlebih dahulu.

Aksi: Jalankan 4 Perintah di Terminal Laragon

Jalankan keempat perintah artisan berikut satu per satu di terminal dari dalam folder project C:/laragon/www/laravel.

SS Terminal php artisan make:migration create_majors_table
Gambar 1a – Perintah pembuatan file migration tabel majors berhasil dijalankan
Aksi: Edit File Migration Tabel Majors

Buka folder database/migrations/ di VS Code, temukan file xxxx_create_majors_table.php and isi method up() dengan kolom id, name, dan timestamps.

SS VS Code isi method up majors_table
Gambar 1b – Definisi kolom tabel majors: id (PK auto-increment) dan name (string)
Aksi: Edit File Migration Tabel Students

Temukan file xxxx_create_students_table.php. Tambahkan kolom nim (unique), name, address, dan major_id sebagai foreign key yang merujuk ke tabel majors dengan opsi onDelete('cascade').

SS VS Code isi method up students_table dengan foreignId major_id
Gambar 1c – Definisi kolom tabel students dengan foreign key major_id → majors.id
Aksi: Edit File Migration Tabel Subjects

Temukan file xxxx_create_subjects_table.php. Tambahkan kolom name dan sks (integer untuk jumlah Satuan Kredit Semester).

SS VS Code isi method up subjects_table dengan kolom sks
Gambar 1d – Definisi kolom tabel subjects: name (string) dan sks (integer)
Aksi: Edit File Migration Tabel Pivot student_subject

Temukan file xxxx_create_student_subject_table.php. Tambahkan student_id and subject_id sebagai foreign key, serta constraint unique(['student_id', 'subject_id']) untuk mencegah duplikasi kombinasi.

SS VS Code isi pivot table student_subject dengan 2 foreign key
Gambar 1e – Tabel pivot student_subject dengan dua foreign key dan unique constraint
Aksi: Jalankan Migration

Setelah keempat file migration terisi, jalankan perintah berikut untuk mengirim semua skema ke database MySQL. Pastikan Laragon sudah menyala dan database laravel sudah ada di phpMyAdmin.

SS Terminal php artisan migrate berhasil, 4 tabel terbuat
Gambar 1f – Log terminal menunjukkan keempat tabel berhasil dibuat di database
Verifikasi di phpMyAdmin: pastikan tabel majors, students, subjects, and student_subject sudah muncul dengan struktur kolom yang benar.
2Membuat Model dengan Eloquent Relationship

Model adalah kelas PHP yang merepresentasikan sebuah tabel database. Di sinilah kita mendefinisikan relasi antar tabel menggunakan method Eloquent. Tiga model yang dibuat: Major, Student, dan Subject.

Aksi: Buat 3 File Model via Terminal

Jalankan perintah artisan berikut satu per satu untuk menghasilkan ketiga file model.

SS Terminal php artisan make:model Major/Student/Subject
Gambar 2a – Ketiga file model berhasil digenerate di folder app/Models/
Aksi: Edit Model Major.php — Definisikan hasMany

Buka app/Models/Major.php. Tambahkan $fillable dan method students() yang mengembalikan relasi hasMany(Student::class) — artinya satu jurusan memiliki banyak mahasiswa.

SS VS Code Major.php dengan method hasMany students
Gambar 2b – Model Major dengan relasi One-to-Many ke Student melalui hasMany()
Aksi: Edit Model Student.php — Definisikan belongsTo & belongsToMany

Buka app/Models/Student.php. Tambahkan method major() dengan belongsTo(Major::class) (setiap mahasiswa milik satu jurusan), and method subjects() dengan belongsToMany(Subject::class) (mahasiswa bisa mengambil banyak mata kuliah).

SS VS Code Student.php dengan belongsTo dan belongsToMany
Gambar 2c – Model Student dengan dua relasi: belongsTo Major dan belongsToMany Subject
Aksi: Edit Model Subject.php — Definisikan belongsToMany

Buka app/Models/Subject.php. Tambahkan method students() dengan belongsToMany(Student::class) — mata kuliah dapat dimiliki oleh banyak mahasiswa.

SS VS Code Subject.php dengan belongsToMany students
Gambar 2d – Model Subject dengan relasi Many-to-Many ke Student
3Membuat Seeder untuk Data Awal

Seeder digunakan untuk mengisi data dummy ke database secara otomatis, sehingga tidak perlu memasukkan data manual satu per satu untuk keperluan pengujian sistem.

Aksi: Buat 3 File Seeder via Terminal
SS Terminal php artisan make:seeder MajorSeeder/SubjectSeeder/StudentSeeder
Gambar 3a – Tiga file seeder berhasil dibuat di folder database/seeders/
Aksi: Edit MajorSeeder.php

Isi method run() dengan array 4 jurusan: Teknik Informatika, Sistem Informasi, Teknik Komputer, dan Manajemen Informatika. Gunakan Major::create() dalam loop foreach.

SS VS Code MajorSeeder.php dengan 4 data jurusan
Gambar 3b – Isi MajorSeeder dengan 4 jurusan yang akan dimasukkan ke tabel majors
Aksi: Edit SubjectSeeder.php

Isi 5 mata kuliah beserta jumlah SKS-nya: Pemrograman Web (3 SKS), Database (3 SKS), Algoritma (2 SKS), Jaringan Komputer (3 SKS), dan Sistem Operasi (2 SKS).

SS VS Code SubjectSeeder.php dengan 5 mata kuliah dan SKS
Gambar 3c – Isi SubjectSeeder dengan 5 mata kuliah beserta nilai SKS masing-masing
Aksi: Edit StudentSeeder.php

Isi 5 data mahasiswa dan gunakan $student->subjects()->attach($subjects) untuk secara acak mengisi tabel pivot dengan 2–4 mata kuliah per mahasiswa. Ini sekaligus mendemonstrasikan metode attach() pada relasi Many-to-Many.

SS VS Code StudentSeeder.php dengan attach ke pivot table
Gambar 3d – StudentSeeder mengisi data mahasiswa sekaligus mengisi tabel pivot secara acak
Aksi: Daftarkan Seeder ke DatabaseSeeder.php & Jalankan

Edit method run() di DatabaseSeeder.php agar memanggil ketiga seeder, lalu jalankan perintah php artisan db:seed di terminal.

SS VS Code DatabaseSeeder.php + Terminal php artisan db:seed sukses
Gambar 3e – DatabaseSeeder memanggil ketiga seeder; log terminal membuktikan pengisian data berhasil
Verifikasi di phpMyAdmin: tabel majors berisi 4 data, subjects berisi 5 data, students berisi 5 data, dan student_subject berisi pasangan relasi acak mahasiswa–mata kuliah.
4Membuat StudentController (Resource CRUD)

Controller bertanggung jawab menerima request dari pengguna, berinteraksi dengan model untuk mengambil atau menyimpan data, lalu mengirimkan data tersebut ke view untuk ditampilkan. Resource Controller secara otomatis menyediakan 7 method standar CRUD.

Aksi: Buat StudentController via Terminal
SS Terminal php artisan make:controller StudentController
Gambar 4a – File StudentController.php berhasil dibuat di app/Http/Controllers/
Aksi: Isi Semua Method di StudentController.php

Isi 7 method lengkap: index() menggunakan Student::with(['major','subjects'])->get() untuk eager loading; store() menggunakan attach() untuk menyimpan relasi pivot; update() menggunakan sync() untuk memperbarui relasi; dan destroy() menggunakan detach() sebelum menghapus data.

SS VS Code StudentController.php dengan 7 method CRUD lengkap
Gambar 4b – Implementasi lengkap StudentController dengan eager loading dan pengelolaan relasi pivot
5Mendaftarkan Resource Route

Laravel Route Resource menghasilkan 7 route sekaligus dengan satu baris kode: GET /students (index), GET /students/create (create), POST /students (store), GET /students/{id} (show), GET /students/{id}/edit (edit), PUT /students/{id} (update), DELETE /students/{id} (destroy). Ini sangat menghemat penulisan kode dibanding mendaftarkan satu per satu.

Aksi: Edit File routes/web.php
SS VS Code routes/web.php dengan Route::resource students
Gambar 5a – Pendaftaran Route::resource('students', StudentController::class) di web.php
Aksi: Verifikasi Route via Terminal

Jalankan php artisan route:list untuk memverifikasi semua route mahasiswa sudah terdaftar dengan benar.

SS Terminal php artisan route:list menampilkan 7 route students
Gambar 5b – Output route:list menampilkan ketujuh endpoint CRUD mahasiswa yang sudah aktif
6Membuat Semua File View Blade

View adalah lapisan antarmuka yang menampilkan data ke pengguna. Kita menggunakan Blade Template Engine Laravel dengan sistem inheritance menggunakan @extends dan @section agar tampilan konsisten dan kode tidak berulang.

Aksi: Buat Folder layouts/ dan students/ di resources/views/

Buat dua folder baru: resources/views/layouts/ untuk layout utama, and resources/views/students/ untuk semua view mahasiswa.

SS VS Code struktur folder layouts dan students di resources/views/
Gambar 6a – Struktur folder view yang rapi: layouts/ untuk template induk, students/ untuk halaman CRUD
Aksi: Buat resources/views/layouts/app.blade.php

File ini adalah layout utama yang berisi navbar Bootstrap, container utama, penampil notifikasi flash message session('success'), dan directive @yield('content') sebagai slot untuk konten tiap halaman.

SS VS Code layouts/app.blade.php dengan navbar and @yield content
Gambar 6b – Template layout utama dengan Bootstrap navbar dan slot @yield('content')
Aksi: Buat resources/views/students/index.blade.php

Halaman utama yang menampilkan tabel daftar mahasiswa dengan kolom NIM, Nama, Jurusan, Badge Mata Kuliah, Total SKS, dan tombol aksi Detail/Edit/Hapus.

SS VS Code students/index.blade.php dengan tabel dan badge mata kuliah
Gambar 6c – View index menampilkan daftar mahasiswa dalam tabel lengkap dengan badge mata kuliah
Aksi: Buat resources/views/students/create.blade.php

Form tambah mahasiswa dengan input NIM, Nama, Alamat, dropdown Jurusan, dan checkbox Mata Kuliah. Menggunakan @csrf untuk keamanan dan @error untuk menampilkan pesan validasi.

SS VS Code students/create.blade.php dengan form dan checkbox matkul
Gambar 6d – Form tambah mahasiswa dengan input lengkap, dropdown jurusan, dan checkbox mata kuliah
Aksi: Buat resources/views/students/edit.blade.php

Form edit yang menampilkan nilai lama data mahasiswa menggunakan old('field', $student->field). Menggunakan @method('PUT') untuk spoofing method HTTP karena HTML form hanya mendukung GET dan POST.

SS VS Code students/edit.blade.php dengan @method PUT dan nilai lama
Gambar 6e – Form edit dengan pre-fill nilai data lama dan PUT method spoofing
Aksi: Buat resources/views/students/show.blade.php

Halaman detail mahasiswa yang menampilkan semua informasi termasuk jurusan dan daftar mata kuliah beserta SKS-nya dalam tampilan tabel informatif.

SS VS Code students/show.blade.php dengan detail lengkap mahasiswa
Gambar 6f – View detail mahasiswa menampilkan semua data termasuk jurusan dan mata kuliah
7Menjalankan dan Menguji Aplikasi di Browser

Langkah terakhir adalah memastikan seluruh komponen yang telah dibuat — Migration, Model, Seeder, Controller, Route, dan View — terhubung dengan baik dan semua fitur CRUD berfungsi normal.

SS Browser halaman index daftar mahasiswa dengan 5 data dari seeder
Gambar 7a – Halaman utama menampilkan 5 data mahasiswa hasil seeder beserta jurusan dan badge mata kuliah
SS Browser form tambah mahasiswa dengan dropdown dan checkbox
Gambar 7b – Form tambah mahasiswa baru dengan dropdown jurusan dan checkbox pemilihan mata kuliah
SS Browser halaman detail show mahasiswa dengan info lengkap
Gambar 7c – Halaman detail menampilkan informasi lengkap mahasiswa beserta jurusan dan daftar mata kuliah
SS Browser form edit mahasiswa dengan data terisi otomatis
Gambar 7d – Form edit dengan data lama mahasiswa yang sudah terisi otomatis dan siap diperbarui
Jika semua tampilan muncul dengan benar dan CRUD berfungsi tanpa error, langkah praktikum utama berhasil diselesaikan.
Latihan 1 — Implementasi 4 Query Relationship

Membuat halaman-halaman terpisah yang masing-masing menampilkan hasil query menggunakan Eloquent Relationship: semua mahasiswa beserta relasinya, ranking jurusan berdasarkan jumlah mahasiswa, filter mata kuliah per mahasiswa, dan total SKS tiap mahasiswa.

1Membuat LatihanController

Buat controller baru khusus untuk menangani keempat query latihan. Setiap method di controller ini menggunakan fitur Eloquent yang berbeda untuk mendemonstrasikan kemampuan query relationship.

Aksi: Jalankan Artisan Make Controller
SS Terminal php artisan make:controller LatihanController
Gambar 8a – LatihanController.php berhasil dibuat di folder app/Http/Controllers/
Aksi: Isi 4 Method di LatihanController.php

Isi method semuaMahasiswa() menggunakan Student::with(['major','subjects'])->get(). Method jurusanTerbanyak() menggunakan Major::withCount('students')->orderBy('students_count','desc')->get(). Method mataKuliahMahasiswa($id) menggunakan Student::with(['major','subjects'])->findOrFail($id). Method totalSks() menggunakan Student::with('subjects')->get().

SS VS Code LatihanController.php dengan 4 method query
Gambar 8b – Implementasi 4 method query di LatihanController menggunakan fitur Eloquent yang beragam
2Menambahkan 4 Route Latihan di web.php

Tambahkan route untuk masing-masing method latihan. Gunakan named route agar lebih mudah direferensikan di view menggunakan route('nama.route').

Aksi: Edit File routes/web.php

Tambahkan baris use App\Http\Controllers\LatihanController; di bagian atas dan daftarkan keempat route GET beserta nama masing-masing.

SS VS Code routes/web.php dengan 4 route latihan
Gambar 9a – Penambahan 4 named route latihan di web.php untuk masing-masing query
3Membuat 4 File View Latihan

Buat folder resources/views/latihan/ dan buat keempat file view di dalamnya. Setiap view menampilkan data dalam format tabel yang informatif dan dilengkapi navigasi antar query.

Aksi: Buat Folder latihan/ & File semua_mahasiswa.blade.php

Query 1: menampilkan tabel semua mahasiswa beserta jurusan dan badge mata kuliah yang diambil. Gunakan loop @foreach($student->subjects as $subject) untuk menampilkan badge tiap mata kuliah.

SS VS Code latihan/semua_mahasiswa.blade.php
Gambar 10a – View Query 1: tabel semua mahasiswa beserta jurusan dan mata kuliah yang diambil
Aksi: Buat File jurusan_terbanyak.blade.php

Query 2: menampilkan ranking jurusan berdasarkan jumlah mahasiswa menggunakan data $major->students_count yang dihasilkan oleh withCount().

SS VS Code latihan/jurusan_terbanyak.blade.php dengan ranking
Gambar 10b – View Query 2: tabel ranking jurusan dari yang terbanyak hingga tersedikit mahasiswanya
Aksi: Buat File matkul_mahasiswa.blade.php

Query 3: dropdown interaktif untuk memilih mahasiswa, lalu menampilkan mata kuliah beserta total SKS mahasiswa yang dipilih. Menggunakan JavaScript sederhana untuk navigasi antar mahasiswa.

SS VS Code latihan/matkul_mahasiswa.blade.php dengan dropdown
Gambar 10c – View Query 3: dropdown pemilih mahasiswa dan tabel mata kuliah beserta total SKS
Aksi: Buat File total_sks.blade.php

Query 4: menampilkan total SKS setiap mahasiswa dengan badge status Normal (≥10 SKS) atau Sedikit (<10 SKS) berdasarkan kalkulasi $student->subjects->sum('sks').

SS VS Code latihan/total_sks.blade.php dengan badge status
Gambar 10d – View Query 4: tabel total SKS mahasiswa dengan badge status berdasarkan jumlah SKS
4Uji Semua Halaman Latihan di Browser

Akses keempat URL latihan secara berurutan di browser untuk memastikan semua query berjalan dan data tampil dengan benar.

Aksi: Buka Keempat URL Latihan di Browser
SS Browser /latihan/semua-mahasiswa — tabel semua mahasiswa + matkul
Gambar 11a – Query 1: Halaman semua mahasiswa beserta jurusan dan mata kuliah yang diambil
SS Browser /latihan/jurusan-terbanyak — tabel ranking jurusan
Gambar 11b – Query 2: Halaman ranking jurusan berdasarkan jumlah mahasiswa (withCount)
SS Browser /latihan/matkul-mahasiswa/1 — matkul mahasiswa tertentu
Gambar 11c – Query 3: Halaman mata kuliah mahasiswa tertentu dengan dropdown pemilih dan total SKS
SS Browser /latihan/total-sks — tabel total SKS + badge status
Gambar 11d – Query 4: Halaman total SKS semua mahasiswa dengan badge Normal/Sedikit
Challenge — Fitur Jadwal Mata Kuliah (Schedule)

Menambahkan relasi baru: setiap Mata Kuliah (Subject) memiliki jadwal (Schedule) yang berisi hari, jam mulai, jam selesai, dan ruangan. Relasi ini adalah One-to-Many antara subjects dan schedules. Jadwal juga akan ditampilkan di halaman detail mahasiswa sehingga mahasiswa dapat melihat jadwal mata kuliah yang diambilnya.

1Buat Migration Tabel Schedules

Tabel schedules menyimpan jadwal tiap mata kuliah. Kolom subject_id adalah foreign key ke tabel subjects. Kolom hari menggunakan tipe enum untuk membatasi input hanya pada hari yang valid (Senin–Sabtu).

Aksi: Buat & Edit Migration Tabel Schedules
SS VS Code migration create_schedules_table dengan kolom lengkap
Gambar 12a – File migration tabel schedules dengan kolom subject_id, hari (enum), jam_mulai, jam_selesai, ruangan
SS Terminal php artisan migrate — tabel schedules berhasil dibuat
Gambar 12b – Log terminal membuktikan tabel schedules berhasil ditambahkan ke database
2Buat Model Schedule & Update Model Subject

Model Schedule mendefinisikan belongsTo(Subject::class) karena setiap jadwal milik satu mata kuliah. Model Subject perlu diperbarui dengan menambahkan method schedules() yang mendefinisikan hasMany(Schedule::class).

Aksi: Buat Model Schedule.php
SS VS Code Schedule.php dengan belongsTo Subject dan fillable
Gambar 13a – Model Schedule dengan relasi belongsTo Subject dan properti fillable lengkap
Aksi: Perbarui Model Subject.php — Tambahkan hasMany Schedules
SS VS Code Subject.php dengan tambahan method schedules hasMany
Gambar 13b – Penambahan method schedules() pada model Subject untuk relasi One-to-Many ke Schedule
3Buat ScheduleSeeder & Jalankan Seeder

Seeder ini mengisi satu jadwal untuk tiap mata kuliah (5 jadwal total), masing-masing di hari dan ruangan yang berbeda. Daftarkan ScheduleSeeder ke DatabaseSeeder lalu jalankan dengan perintah db:seed --class=ScheduleSeeder.

Aksi: Edit ScheduleSeeder.php & Daftarkan ke DatabaseSeeder
SS VS Code ScheduleSeeder.php dengan 5 data jadwal per matkul
Gambar 14a – ScheduleSeeder berisi 5 jadwal mata kuliah dengan hari, jam, dan ruangan masing-masing
SS Terminal php artisan db:seed --class=ScheduleSeeder berhasil
Gambar 14b – Seeder jadwal berhasil dijalankan; tabel schedules terisi 5 data
4Buat ScheduleController & Tambahkan Route

ScheduleController menyediakan fitur CRUD jadwal: index menampilkan jadwal dikelompokkan per mata kuliah, create/store untuk tambah jadwal baru, edit/update untuk ubah jadwal, dan destroy untuk hapus jadwal. Route resource menghasilkan semua endpoint secara otomatis.

Aksi: Buat & Isi ScheduleController.php
SS VS Code ScheduleController.php dengan 5 method CRUD
Gambar 15a – ScheduleController dengan method index, create, store, edit, update, destroy
Aksi: Tambahkan Route::resource Schedules di web.php
SS VS Code routes/web.php dengan Route::resource schedules
Gambar 15b – Penambahan Route::resource('schedules', ScheduleController::class) di web.php
5Buat View Jadwal (Index, Create, Edit)

Buat folder resources/views/schedules/ dan tiga file view di dalamnya. Halaman index mengelompokkan jadwal per mata kuliah menggunakan card per subject. Halaman create dan edit menyediakan form dengan dropdown hari, input jam, dan input ruangan.

Aksi: Buat schedules/index.blade.php
SS VS Code schedules/index.blade.php dengan card per mata kuliah
Gambar 16a – View index jadwal menampilkan jadwal dikelompokkan per kartu mata kuliah
Aksi: Buat schedules/create.blade.php & schedules/edit.blade.php
SS VS Code schedules/create.blade.php dengan form jadwal lengkap
Gambar 16b – Form tambah jadwal dengan dropdown mata kuliah, hari, input jam, dan ruangan
6Tampilkan Jadwal di Halaman Detail Mahasiswa

Perbarui StudentController method show() untuk menggunakan eager loading subjects.schedules — ini memuat relasi bertingkat sekaligus: subjects dari mahasiswa, lalu schedules dari setiap subject. Perbarui view students/show.blade.php agar setiap card mata kuliah menampilkan tabel jadwalnya.

Aksi: Update Method show() di StudentController

Ubah eager loading dari ['major','subjects'] menjadi ['major','subjects.schedules'] agar jadwal ikut termuat dalam satu query efisien.

SS VS Code StudentController show dengan subjects.schedules eager loading
Gambar 17a – Update eager loading di show() menjadi subjects.schedules untuk memuat jadwal sekaligus
Aksi: Update students/show.blade.php — Tampilkan Kartu Jadwal

Tambahkan section di bawah tabel info mahasiswa yang menampilkan kartu per mata kuliah beserta tabel jadwalnya (hari, jam mulai, jam selesai, ruangan).

SS VS Code students/show.blade.php dengan card jadwal per matkul
Gambar 17b – View show yang telah diperbarui untuk menampilkan jadwal tiap mata kuliah dalam kartu terpisah
7Uji Fitur Challenge di Browser

Akses halaman jadwal dan detail mahasiswa untuk memverifikasi integrasi fitur challenge berjalan sempurna.

SS Browser /schedules — halaman daftar jadwal per mata kuliah
Gambar 18a – Halaman jadwal mata kuliah dengan jadwal dikelompokkan per kartu mata kuliah
SS Browser /schedules/create — form tambah jadwal
Gambar 18b – Form tambah jadwal baru dengan pemilihan mata kuliah, hari, jam, dan ruangan
SS Browser /students/1 — detail mahasiswa dengan jadwal matkul tampil
Gambar 18c – Halaman detail mahasiswa menampilkan kartu tiap mata kuliah beserta jadwal hari, jam, dan ruangannya

Melalui serangkaian langkah praktikum Pertemuan 8 ini, implementasi sistem akademik dengan Eloquent Relationship berhasil diselesaikan secara menyeluruh:

  • Migration & Foreign Key: Keempat tabel (majors, students, subjects, student_subject) berhasil dibuat dengan constraint referensial yang tepat dan cascading delete.
  • Eloquent Relationship: Relasi One-to-Many antara Major–Student dan Many-to-Many antara Student–Subject berhasil diimplementasikan dan berfungsi dengan benar.
  • Eager Loading: Penggunaan with() and with('subjects.schedules') berhasil menghindari N+1 query problem, membuat aplikasi lebih efisien.
  • CRUD Lengkap: Operasi tambah, lihat, edit, dan hapus data mahasiswa berjalan dengan validasi form yang aman, termasuk pengelolaan relasi pivot menggunakan attach(), sync(), dan detach().
  • Latihan Query: Keempat query relationship — semua mahasiswa, ranking jurusan, filter matkul per mahasiswa, dan total SKS — berhasil ditampilkan di halaman terpisah.
  • Challenge Jadwal: Fitur jadwal mata kuliah berhasil ditambahkan dengan relasi Schedule–Subject dan terintegrasi ke halaman detail mahasiswa melalui eager loading bertingkat.

Berdasarkan seluruh tahapan praktikum yang telah dilaksanakan, diperoleh beberapa poin kesimpulan penting:

  1. Laravel Eloquent menyediakan sintaks relationship yang ekspresif dan mudah dipahami melalui method hasMany(), belongsTo(), dan belongsToMany() yang mengeliminasi penulisan query SQL JOIN yang panjang secara manual.
  2. Tabel pivot pada relasi Many-to-Many dikelola secara otomatis oleh Eloquent melalui method attach() untuk menambah, sync() untuk memperbarui, dan detach() untuk menghapus relasi.
  3. Teknik Eager Loading dengan metode with() adalah praktik terbaik yang wajib diterapkan untuk mencegah N+1 query problem pada relasi data berskala besar.
  4. Nested eager loading seperti with('subjects.schedules') memungkinkan pemuatan relasi bertingkat sekaligus dalam satu query yang sangat efisien.
  5. Pemahaman mendalam tentang konsep relasi database adalah fondasi yang kuat untuk membangun aplikasi web yang terstruktur, efisien, dan mudah dipelihara.