Skip to main content
Praktikum 8·
4 Juni 2026

Laravel Relationship Student, Major, dan Subject

REPOSITORY_GITHUB

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

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.

IVLangkah Kerja Praktikum

1

Langkah 1: Membuat Migration

Migration digunakan untuk mendefinisikan struktur database secara programatik. Terdapat empat migration yang dibuat sesuai ERD.

1.1 Migration Tabel majors

bash
php artisan make:migration create_majors_table
Migration Tabel majors view 2

1.2 Migration Tabel students

bash
php artisan make:migration create_students_table
Migration Tabel students view 2

1.3 Migration Tabel subjects

bash
php artisan make:migration create_subjects_table
Migration Tabel subjects view 2

1.4 Migration Tabel Pivot student_subject

php artisan make:migration create_student_subject_table

Migration Tabel Pivot student_subject view 2

1.5 Jalankan semua migration dengan perintah:

bash
php artisan migrate
2

Langkah 2: Membuat Model dengan Relationship

2.1 Model Major

bash
php artisan make:model Major
Model Major view 2

2.2 Model Student

bash
php artisan make:model Student
Model Student view 2

2.3 Model Subject

bash
php artisan make:model Subject
Model Subject view 2
3

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

bash
php artisan make:seeder MajorSeeder
Seeder untuk Major view 2

3.2 Seeder untuk Subject

bash
php artisan make:seeder SubjectSeeder
Seeder untuk Subject view 2

3.3 Seeder untuk Student

bash
php artisan make:seeder StudentSeeder
Seeder untuk Student view 2

3.4 Update DatabaseSeeder

Update DatabaseSeeder view 1

3.5 Jalankan Seeder

bash
php artisan db:seed
4

Langkah 4: Membuat Controller (StudentController)

StudentController menangani seluruh operasi CRUD mahasiswa. Berikut implementasi lengkap controller berdasarkan file yang dikirim:

4.1 Method index(), show(), create()

bash
php artisan make:controller StudentController
Method index(), show(), create() view 2

4.2 Method store()

Method store() view 1

4.3 Method edit() dan update()

Method edit() dan update() view 1

4.4 Method destroy()

Method destroy() view 1
5

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.

Langkah 5: Membuat Routes visual reference 2
6

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 --}}

Layout utama view 2

6.2 Index Students

{{-- resources/views/students/index.blade.php --}}

Index Students view 2

6.3 Create Student

{{-- resources/views/students/create.blade.php --}}

Create Student view 2
7

Screenshot Output

Screenshot Output visual reference 1
Screenshot Output visual reference 2
Screenshot Output visual reference 3

VLatihan dan Tugas

1

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

Method reportTopMajor() pada StudentController view 1

#2 Route

bash
Route::get('/report/top-major', [StudentController::class, 'reportTopMajor'])->name('report.top-major');

#3 View: report-top-major.blade.php

View: report-top-major.blade.php view 1

#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

Screenshot Output view 1
2

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

Method reportTotalSks() pada StudentController view 1

#2 Route

bash
Route::get('/report/total-sks', [StudentController::class, 'reportTotalSks'])->name('report.total-sks');

#3 View: report-total-sks.blade.php

View: report-total-sks.blade.php view 1

#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

Screenshot Output view 1

VIKesimpulan

Berdasarkan praktikum yang telah dilakukan, dapat ditarik kesimpulan sebagai berikut: 1. Laravel Eloquent ORM menyederhanakan pengelolaan relasi antar tabel melalui deklarasi relationship pada kelas Model. Relasi One-to-Many antara Major dan Student diimplementasikan dengan hasMany() dan belongsTo(), sedangkan relasi Many-to- Many antara Student dan Subject menggunakan belongsToMany() dengan tabel pivot student_subject. 2. Penggunaan eager loading melalui metode with() sangat penting untuk menghindari N+1 query problem. Tanpa eager loading, setiap iterasi pada koleksi Student akan menghasilkan query tambahan ke tabel majors dan student_subject yang berdampak signifikan pada performa saat jumlah data besar. 3. Laravel menyediakan metode manipulasi pivot yang ekspresif: attach() untuk menambah relasi baru, detach() untuk menghapus, dan sync() untuk sinkronisasi yang merupakan kombinasi keduanya. Pemilihan metode bergantung pada konteks operasi (store menggunakan attach, update menggunakan sync). 4. Metode agregasi withCount() dan withSum() memungkinkan pengambilan data statistik tanpa perlu menulis subquery SQL secara manual. Hasil agregasi tersedia sebagai atribut dinamis pada objek model yang langsung dapat diakses di view Blade. 5. Fitur laporan reportTopMajor dan reportTotalSks membuktikan bahwa Eloquent dapat digunakan untuk kebutuhan reporting tanpa library tambahan, cukup dengan memanfaatkan chaining method yang sudah disediakan framework secara built-in. 6. Route naming dengan ->name() memudahkan pembuatan URL di seluruh view melalui helper route(), sehingga perubahan URL endpoint cukup dilakukan di satu tempat (web.php) tanpa harus memperbarui setiap view yang mereferensikannya.