Laravel Eloquent ORM (Object-Relational Mapping) adalah fitur bawaan Laravel yang menyediakan cara elegan untuk berinteraksi dengan database. Setiap tabel database memiliki Model yang berkorespondensi. Eloquent memungkinkan developer mendefinisikan hubungan antar tabel secara deklaratif langsung di dalam kelas Model.
ITujuan Praktikum
Setelah menyelesaikan praktikum ini, mahasiswa diharapkan mampu:
- ✓Memahami konsep relationship dalam Laravel
- ✓Mengimplementasikan One-to-Many dan Many-to-Many relationship
- ✓Membuat migration dengan foreign key
- ✓Menggunakan Eloquent relationship untuk query data
- ✓Menampilkan data dengan relationship di view
IIDasar Teori
IVLangkah Kerja Praktikum
Langkah 1: Membuat Migration
Migration digunakan untuk mendefinisikan struktur database secara programatik. Terdapat empat migration yang dibuat sesuai ERD.
1.1 — Migration Tabel majors
php artisan make:migration create_majors_table
1.2 — Migration Tabel students
php artisan make:migration create_students_table
1.3 — Migration Tabel subjects
php artisan make:migration create_subjects_table
1.4 — Migration Tabel Pivot student_subject
php artisan make:migration create_student_subject_table

1.5 — Jalankan semua migration dengan perintah:
php artisan migrateLangkah 2: Membuat Model dengan Relationship
2.1 — Model Major
php artisan make:model Major
2.2 — Model Student
php artisan make:model Student
2.3 — Model Subject
php artisan make:model Subject
Langkah 3: Membuat Seeder
Seeder mengisi database dengan data sampel. Urutan seeder harus diperhatikan karena StudentSeeder bergantung pada data Major dan Subject yang sudah ada.
3.1 — Seeder untuk Major
php artisan make:seeder MajorSeeder
3.2 — Seeder untuk Subject
php artisan make:seeder SubjectSeeder
3.3 — Seeder untuk Student
php artisan make:seeder StudentSeeder
3.4 — Update DatabaseSeeder

3.5 — Jalankan Seeder
php artisan db:seedLangkah 4: Membuat Controller (StudentController)
StudentController menangani seluruh operasi CRUD mahasiswa. Berikut implementasi lengkap controller berdasarkan file yang dikirim:
4.1 — Method index(), show(), create()
php artisan make:controller StudentController
4.2 — Method store()

4.3 — Method edit() dan update()

4.4 — Method destroy()

Langkah 5: Membuat Routes
Langkah selanjutnya adalah mendefinisikan rute (routes) sebagai jalur navigasi aplikasi. Pada file routes/web.php, kita menggunakan metode Route::resource yang akan secara otomatis men-generate seluruh rute standar untuk operasi CRUD (Create, Read, Update, Delete) yang mengarah ke StudentController. Selain itu, kita juga menambahkan rute root (/) yang berfungsi untuk langsung mengarahkan (redirect) pengguna ke halaman utama daftar mahasiswa (students.index) ketika pertama kali mengakses aplikasi.

Membuat Views
Setelah Model, Controller, dan Route terhubung, tahap terakhir adalah membangun antarmuka pengguna (User Interface) menggunakan Blade Template Engine bawaan Laravel. Pada tahap ini, kita akan menstrukturkan tampilan dengan membuat sebuah layout utama (app.blade.php) sebagai kerangka dasar (termasuk memuat library Bootstrap 5). Selanjutnya, kita akan memecah tampilan ke dalam beberapa file spesifik, seperti index.blade.php untuk menampilkan tabel daftar mahasiswa secara menyeluruh beserta relasinya, dan create.blade.php untuk menampilkan form input data mahasiswa baru yang dinamis.
6.1 — Layout utama
{{-- resources/views/layouts/app.blade.php --}}

6.2 — Index Students
{{-- resources/views/students/index.blade.php --}}

6.3 — Create Student
{{-- resources/views/students/create.blade.php --}}

Screenshot Output



VLatihan dan Tugas
Tugas 1: Laporan Jurusan dengan Mahasiswa Terbanyak
Menampilkan seluruh jurusan beserta jumlah mahasiswanya, diurutkan dari yang terbanyak, dengan highlight pada jurusan teratas.
#1 Method reportTopMajor() pada StudentController

#2 Route
Route::get('/report/top-major', [StudentController::class, 'reportTopMajor'])->name('report.top-major');#3 View: report-top-major.blade.php

#4 Penjelasan Logika
1. withCount('students') mengeksekusi subquery COUNT secara otomatis dan menambahkan atribut dinamis students_count pada setiap objek Major tanpa perlu raw SQL. 2. orderByDesc('students_count') mengurutkan hasil dari jumlah mahasiswa terbesar ke terkecil. 3. $majors->first() mengambil elemen pertama koleksi yang sudah terurut sebagai jurusan terbanyak untuk ditampilkan sebagai alert informatif. 4. Di view, $loop->first adalah variabel bawaan Blade yang bernilai true pada iterasi pertama foreach, digunakan untuk memberi kelas CSS table-success sebagai visual highlight baris teratas.
#5 Screenshot Output

Tugas 2: Laporan Total SKS Setiap Mahasiswa
Menampilkan daftar seluruh mahasiswa beserta jurusan dan total SKS yang mereka ambil, diurutkan dari total SKS terbesar.
#1 Method reportTotalSks() pada StudentController

#2 Route
Route::get('/report/total-sks', [StudentController::class, 'reportTotalSks'])->name('report.total-sks');#3 View: report-total-sks.blade.php

#4 Penjelasan Logika
1. withSum('subjects', 'sks') secara otomatis mengeksekusi query SUM(sks) pada tabel pivot dan menambahkan atribut dinamis subjects_sum_sks pada setiap objek Student. 2. with('major') memuat relasi jurusan bersamaan menggunakan eager loading, mencegah N+1 query problem saat mengakses $student->major->name di dalam loop. 3. orderByDesc('subjects_sum_sks') mengurutkan mahasiswa dari total SKS terbesar ke terkecil. 4. Operator ?? 0 pada $student->subjects_sum_sks berfungsi sebagai null-safe fallback: jika mahasiswa tidak memiliki mata kuliah, ditampilkan angka 0 bukan error atau null. 5. Operator ?? '-' pada $student->major->name mengantisipasi kondisi di mana kolom major_id null atau relasi tidak ditemukan.
#5 Screenshot Output
