Laravel Relationship · One-to-Many · Many-to-Many
Laravel Relationship · Student · Major · Subject
Pada praktikum ke-8 ini, kegiatan berfokus pada penerapan konsep Relationship dalam framework Laravel menggunakan Eloquent ORM. Relationship merupakan fitur penting yang memungkinkan model-model saling berhubungan, mencerminkan relasi antar tabel di dalam database.
Dalam praktikum ini dibangun sebuah sistem akademik sederhana yang melibatkan tiga entitas utama: Major (jurusan), Student (mahasiswa), dan Subject (mata kuliah). Sistem ini mengimplementasikan relasi One-to-Many antara Major dan Student, serta relasi Many-to-Many antara Student dan Subject melalui tabel pivot student_subject.
Tujuan dari praktikum ini adalah memahami dan mengimplementasikan konsep relationship dalam Laravel. Mahasiswa diharapkan mampu membuat migration dengan foreign key, menggunakan Eloquent relationship untuk query data, serta menampilkan data hasil relationship pada view menggunakan Blade Template Engine. Selain itu, mahasiswa juga diharapkan memahami pentingnya eager loading untuk menghindari masalah N+1 query.
Praktikum ini terdiri dari beberapa tahapan, mulai dari perancangan struktur database dan ERD, pembuatan migration, seeder, model dengan definisi relationship, controller dengan eager loading, hingga view yang menampilkan data relasional.
2.1 Struktur Database & ERD
Sistem akademik yang dibangun memiliki empat tabel: majors, students, subjects, dan tabel pivot student_subject. Tabel students memiliki foreign key major_id yang merujuk ke tabel majors (relasi Many-to-One), sedangkan hubungan antara students dan subjects dijembatani oleh tabel pivot student_subject yang menyimpan student_id dan subject_id (relasi Many-to-Many).
Tabel berikut merangkum seluruh relasi antar entitas yang dibangun pada praktikum ini:
| Model (dari) | Tipe Relasi | Model (ke) | Method |
|---|---|---|---|
| Major | One-to-Many | Student | hasMany(Student::class) |
| Student | Many-to-One | Major | belongsTo(Major::class) |
| Student | Many-to-Many | Subject | belongsToMany(Subject::class) |
| Subject | Many-to-Many | Student | belongsToMany(Student::class) |
2.2 Migration
Dibuat empat file migration secara berurutan: create_majors_table, create_students_table, create_subjects_table, dan create_student_subject_table. Urutan pembuatan sangat penting karena tabel yang memiliki foreign key harus dibuat setelah tabel yang dirujuk. Tabel students menggunakan foreignId('major_id')->constrained('majors')->onDelete('cascade') agar data mahasiswa ikut terhapus saat jurusan dihapus. Tabel pivot student_subject memiliki unique constraint pada kombinasi student_id dan subject_id untuk mencegah duplikasi data.
// Hasil perintah php artisan migrate — keempat tabel terbentuk
2.3 Seeding
Dibuat tiga seeder: MajorSeeder (4 data jurusan), SubjectSeeder (5 mata kuliah), dan StudentSeeder (5 mahasiswa). Pada StudentSeeder, setiap mahasiswa secara acak diberikan 2–4 mata kuliah menggunakan method attach() pada relasi Many-to-Many, yaitu $student->subjects()->attach($subjects). Semua seeder dipanggil secara berurutan melalui DatabaseSeeder dan dijalankan dengan perintah php artisan db:seed.
// Data hasil seeding pada seluruh tabel di database
2.4 Model & Eloquent Relationship
Ketiga model didefinisikan beserta method relationship-nya. Model Major mendefinisikan hasMany(Student::class) karena satu jurusan dapat memiliki banyak mahasiswa. Model Student mendefinisikan belongsTo(Major::class) untuk relasi ke jurusan, dan belongsToMany(Subject::class) untuk relasi ke mata kuliah melalui tabel pivot. Model Subject mendefinisikan belongsToMany(Student::class) sebagai sisi lain dari relasi Many-to-Many.
// Ketiga model dengan definisi Eloquent relationship
2.5 Controller & Eager Loading
StudentController dibuat sebagai resource controller dengan 7 method CRUD. Pada method index() dan show(), digunakan eager loading melalui Student::with(['major', 'subjects'])->get() untuk memuat data relasi secara efisien dan menghindari masalah N+1 query. Method store() menyimpan data mahasiswa lalu menghubungkannya dengan mata kuliah menggunakan attach(), sedangkan method update() menggunakan sync() untuk memperbarui relasi pivot secara otomatis. Method destroy() memanggil detach() sebelum menghapus data untuk membersihkan record pada tabel pivot.
// StudentController dengan eager loading dan method pivot (attach, sync, detach)
2.6 View & Tampilan Aplikasi
View dibuat menggunakan Blade Template Engine dengan layout utama pada resources/views/layouts/app.blade.php. Halaman index menampilkan seluruh data mahasiswa dalam bentuk tabel yang memuat NIM, nama, jurusan (dari relasi $student->major->name), mata kuliah berupa badge (dari relasi $student->subjects), dan total SKS yang dihitung menggunakan $student->subjects->sum('sks'). Halaman create dan edit menyediakan form dengan dropdown jurusan dan checkbox mata kuliah.
// Halaman index daftar mahasiswa dengan data relasi jurusan dan mata kuliah
// Form tambah mahasiswa dengan dropdown jurusan dan checkbox mata kuliah
Berdasarkan praktikum yang telah dilakukan, Eloquent Relationship pada Laravel menyediakan cara yang elegan dan efisien untuk mengelola relasi antar tabel di database. Relasi One-to-Many diimplementasikan menggunakan kombinasi hasMany dan belongsTo, sedangkan relasi Many-to-Many membutuhkan tabel pivot dan diimplementasikan menggunakan belongsToMany di kedua sisi model.
Penggunaan eager loading dengan with() sangat penting untuk performa aplikasi karena mencegah masalah N+1 query yang dapat memperlambat aplikasi saat data bertambah banyak. Method pivot seperti attach(), detach(), dan sync() memudahkan pengelolaan data relasi Many-to-Many tanpa perlu menulis query SQL secara manual. Praktikum ini menjadi fondasi penting untuk membangun aplikasi web yang lebih kompleks dengan struktur data relasional.