Setelah menyelesaikan praktikum ini, mahasiswa diharapkan mampu:
- Memahami konsep dan jenis-jenis Relationship dalam Laravel Eloquent ORM.
- Mengimplementasikan relasi One-to-Many antara tabel
majorsdanstudents. - Mengimplementasikan relasi Many-to-Many antara tabel
studentsdansubjectsmelalui 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.
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.
Jalankan keempat perintah artisan berikut satu per satu di terminal dari dalam folder project C:/laragon/www/laravel.
Buka folder database/migrations/ di VS Code, temukan file xxxx_create_majors_table.php and isi method up() dengan kolom id, name, dan timestamps.
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').
Temukan file xxxx_create_subjects_table.php. Tambahkan kolom name dan sks (integer untuk jumlah Satuan Kredit Semester).
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.
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.
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.
Jalankan perintah artisan berikut satu per satu untuk menghasilkan ketiga file model.
Buka app/Models/Major.php. Tambahkan $fillable dan method students() yang mengembalikan relasi hasMany(Student::class) — artinya satu jurusan memiliki banyak mahasiswa.
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).
Buka app/Models/Subject.php. Tambahkan method students() dengan belongsToMany(Student::class) — mata kuliah dapat dimiliki oleh banyak mahasiswa.
Seeder digunakan untuk mengisi data dummy ke database secara otomatis, sehingga tidak perlu memasukkan data manual satu per satu untuk keperluan pengujian sistem.
Isi method run() dengan array 4 jurusan: Teknik Informatika, Sistem Informasi, Teknik Komputer, dan Manajemen Informatika. Gunakan Major::create() dalam loop foreach.
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).
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.
Edit method run() di DatabaseSeeder.php agar memanggil ketiga seeder, lalu jalankan perintah php artisan db:seed di terminal.
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.
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.
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.
Jalankan php artisan route:list untuk memverifikasi semua route mahasiswa sudah terdaftar dengan benar.
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.
Buat dua folder baru: resources/views/layouts/ untuk layout utama, and resources/views/students/ untuk semua view mahasiswa.
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.
Halaman utama yang menampilkan tabel daftar mahasiswa dengan kolom NIM, Nama, Jurusan, Badge Mata Kuliah, Total SKS, dan tombol aksi Detail/Edit/Hapus.
Form tambah mahasiswa dengan input NIM, Nama, Alamat, dropdown Jurusan, dan checkbox Mata Kuliah. Menggunakan @csrf untuk keamanan dan @error untuk menampilkan pesan validasi.
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.
Halaman detail mahasiswa yang menampilkan semua informasi termasuk jurusan dan daftar mata kuliah beserta SKS-nya dalam tampilan tabel informatif.
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.
Buat controller baru khusus untuk menangani keempat query latihan. Setiap method di controller ini menggunakan fitur Eloquent yang berbeda untuk mendemonstrasikan kemampuan query relationship.
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().
Tambahkan route untuk masing-masing method latihan. Gunakan named route agar lebih mudah direferensikan di view menggunakan route('nama.route').
Tambahkan baris use App\Http\Controllers\LatihanController; di bagian atas dan daftarkan keempat route GET beserta nama masing-masing.
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.
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.
Query 2: menampilkan ranking jurusan berdasarkan jumlah mahasiswa menggunakan data $major->students_count yang dihasilkan oleh withCount().
Query 3: dropdown interaktif untuk memilih mahasiswa, lalu menampilkan mata kuliah beserta total SKS mahasiswa yang dipilih. Menggunakan JavaScript sederhana untuk navigasi antar mahasiswa.
Query 4: menampilkan total SKS setiap mahasiswa dengan badge status Normal (≥10 SKS) atau Sedikit (<10 SKS) berdasarkan kalkulasi $student->subjects->sum('sks').
Akses keempat URL latihan secara berurutan di browser untuk memastikan semua query berjalan dan data tampil dengan benar.
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).
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).
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.
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.
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.
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.
Ubah eager loading dari ['major','subjects'] menjadi ['major','subjects.schedules'] agar jadwal ikut termuat dalam satu query efisien.
Tambahkan section di bawah tabel info mahasiswa yang menampilkan kartu per mata kuliah beserta tabel jadwalnya (hari, jam mulai, jam selesai, ruangan).
Akses halaman jadwal dan detail mahasiswa untuk memverifikasi integrasi fitur challenge berjalan sempurna.
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()andwith('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(), dandetach(). - 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:
- 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.
- 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.
- Teknik Eager Loading dengan metode
with()adalah praktik terbaik yang wajib diterapkan untuk mencegah N+1 query problem pada relasi data berskala besar. - Nested eager loading seperti
with('subjects.schedules')memungkinkan pemuatan relasi bertingkat sekaligus dalam satu query yang sangat efisien. - Pemahaman mendalam tentang konsep relasi database adalah fondasi yang kuat untuk membangun aplikasi web yang terstruktur, efisien, dan mudah dipelihara.