Setelah menyelesaikan praktikum ini, mahasiswa diharapkan mampu:
Relationship dalam Laravel adalah fitur Eloquent ORM yang memungkinkan model saling terhubung satu sama lain sesuai relasi di database. Terdapat beberapa jenis relationship yang umum digunakan, antara lain One-to-One (satu data memiliki tepat satu data lain), One-to-Many (satu data memiliki banyak data lain), dan Many-to-Many (banyak data berhubungan dengan banyak data lain melalui tabel pivot).
Pada praktikum ini dibuat sistem akademik sederhana dengan tiga entitas utama: Major (jurusan), Student (mahasiswa), dan Subject (mata kuliah). Major memiliki banyak Student (One-to-Many), sedangkan Student dan Subject memiliki relasi Many-to-Many melalui tabel pivot student_subject. Pada bagian challenge, ditambahkan entitas Jadwal yang berelasi One-to-One dengan Subject.
| Relationship | Dari | Ke | Method Eloquent |
|---|---|---|---|
| One-to-Many | Major | Student | hasMany() |
| Many-to-One | Student | Major | belongsTo() |
| Many-to-Many | Student | Subject | belongsToMany() |
| Many-to-Many | Subject | Student | belongsToMany() |
| One-to-One | Subject | Jadwal | hasOne() |
| One-to-One | Jadwal | Subject | belongsTo() |
Buat 4 file migration untuk tabel majors, students, subjects, dan tabel pivot student_subject. Masing-masing dibuat dengan perintah php artisan make:migration.
Buat file migration untuk tabel major dengan perintah php artisan make:migration create_majors_table.
Tabel majors hanya memiliki kolom id, name, dan timestamps.
Buat file migration untuk tabel student dengan perintah php artisan make:migration create_students_table.
Tabel students memiliki kolom nim (unique), name, address, dan major_id sebagai foreign key ke tabel majors dengan cascade delete.
Buat file migration untuk tabel subject dengan perintah php artisan make:migration create_subjects_table.
Tabel subjects memiliki kolom id (unique), name, dan sks.
Buat file migration untuk tabel student_subject dengan perintah php artisan make:migration create_student_subject_table.
Tabel pivot student_subject menghubungkan Student dan Subject melalui student_id dan subject_id sebagai foreign key. Kombinasi keduanya dibuat unique untuk mencegah duplikasi data.
Setelah semua file migration selesai, jalankan php artisan migrate untuk membuat seluruh tabel di database.
Dibuat tiga model: Major, Student, dan Subject. Masing-masing model dilengkapi dengan method relationship Eloquent.
Model: MajorBuat file model untuk Major dengan perintah php artisan make:model Major.
Model Major memiliki method students() dengan hasMany(Student::class) yang menyatakan bahwa satu jurusan memiliki banyak mahasiswa.
Buat file model untuk Student dengan perintah php artisan make:model Student.
Model Student memiliki dua relationship: major() dengan belongsTo(Major::class) untuk relasi ke jurusan, dan subjects() dengan belongsToMany(Subject::class) untuk relasi Many-to-Many ke mata kuliah.
Buat file model untuk Subject dengan perintah php artisan make:model Subject.
Model Subject memiliki method students() dengan belongsToMany(Student::class) sebagai sisi lain dari relasi Many-to-Many.
Dibuat tiga seeder untuk mengisi data awal: MajorSeeder, SubjectSeeder, dan StudentSeeder. Urutan pemanggilan seeder penting karena StudentSeeder bergantung pada data Major dan Subject.
MajorSeeder
StudentSeeder mengisi data mahasiswa sekaligus menghubungkan setiap mahasiswa ke beberapa mata kuliah secara acak menggunakan method attach() pada relationship.
Ketiga seeder didaftarkan di DatabaseSeeder.php dengan urutan MajorSeeder → SubjectSeeder → StudentSeeder, kemudian dijalankan dengan perintah php artisan db:seed.
Dibuat StudentController dengan method-method CRUD lengkap. Pada method index() dan show() digunakan eager loading dengan Student::with(['major', 'subjects']) untuk menghindari N+1 query problem saat mengakses data relationship.
Method store() menyimpan data mahasiswa baru dan menghubungkannya ke mata kuliah menggunakan attach(). Method update() menggunakan sync() untuk memperbarui relasi Many-to-Many. Method destroy() memanggil detach() terlebih dahulu sebelum menghapus data.
Buat Route::resource('students', StudentController::class) yang secara otomatis mendaftarkan semua route CRUD sekaligus. Route / diarahkan ke halaman daftar mahasiswa.
Dibuat layout utama yang menggunakan Bootstrap 5 dengan navbar, kemudian dibuat view untuk halaman daftar mahasiswa, form tambah, dan form edit.
Layout: layouts/student.blade.phpLayout menggunakan Bootstrap 5 dari CDN, dilengkapi navbar dan area untuk menampilkan pesan sukses dari session.
Halaman index menampilkan tabel daftar mahasiswa lengkap dengan nama jurusan (dari relasi $student->major->name), badge mata kuliah (dari relasi $student->subjects), dan total SKS menggunakan $student->subjects->sum('sks').
Form tambah mahasiswa menampilkan dropdown jurusan dan checkbox mata kuliah yang datanya diambil dari database, sehingga form bersifat dinamis.
Form edit mahasiswa mirip dengan form tambah, namun data yang sudah ada ditampilkan sebagai default value. Checkbox mata kuliah yang sudah diambil mahasiswa akan tercentang secara otomatis menggunakan kondisi in_array($subject->id, $student->subjects->pluck('id')->toArray()).
Halaman detail mahasiswa menampilkan informasi lengkap mahasiswa, termasuk jurusan dan daftar mata kuliah yang diambil beserta SKS masing-masing.
Jalankan server dengan php artisan serve kemudian akses http://127.0.0.1:8000/students di browser.
Halaman index menampilkan seluruh data mahasiswa beserta jurusan, badge mata kuliah, dan total SKS masing-masing.
Klik tombol Tambah Mahasiswa untuk membuka form. Isi NIM, nama, alamat, pilih jurusan dari dropdown, dan centang mata kuliah yang diambil.
Setelah klik Simpan, halaman kembali ke daftar mahasiswa dan menampilkan pesan sukses bahwa data berhasil ditambahkan.
Klik tombol Edit untuk membuka form edit. Data lama sudah terisi otomatis di setiap field, dan checkbox mata kuliah yang sudah diambil tercentang secara otomatis.
Setelah klik Update, halaman kembali ke daftar mahasiswa dan menampilkan pesan sukses bahwa data berhasil diperbarui.
Klik tombol Hapus pada salah satu mahasiswa. Muncul dialog konfirmasi browser sebelum data benar-benar dihapus.
Setelah konfirmasi, data mahasiswa beserta seluruh relasinya ke mata kuliah dihapus, dan halaman menampilkan pesan sukses dengan daftar mahasiswa yang sudah terupdate.
Klik tombol Detail pada salah satu mahasiswa untuk melihat informasi lengkapnya, termasuk jurusan dan daftar mata kuliah yang diambil beserta SKS masing-masing.
Menambahkan jadwal untuk setiap mata kuliah menggunakan relasi One-to-One antara Subject dan Jadwal
Dibuat migration baru untuk tabel jadwals yang menyimpan informasi jadwal setiap mata kuliah. Tabel ini memiliki subject_id sebagai foreign key ke tabel subjects, serta kolom hari, jam_mulai, jam_selesai, dan ruangan.
Jalankan php artisan migrate untuk membuat tabel jadwal di database.
Dibuat model Jadwal dengan method subject() menggunakan belongsTo(Subject::class), menyatakan bahwa satu jadwal milik satu mata kuliah.
Model Subject diperbarui dengan menambahkan method jadwal() menggunakan hasOne(Jadwal::class), menyatakan bahwa satu mata kuliah memiliki satu jadwal. Inilah implementasi relasi One-to-One.
Buat JadwalSeeder untuk mengisi data jadwal awal pada setiap mata kuliah. Setiap mata kuliah mendapatkan satu jadwal dengan informasi hari, jam mulai, jam selesai, dan ruangan.
Daftarkan JadwalSeeder di DatabaseSeeder.php setelah SubjectSeeder karena membutuhkan data subject yang sudah ada. Kemudian dijalankan dengan php artisan db:seed --class=JadwalSeeder.
Tambahkan method jadwal() pada StudentController yang mengambil semua data Subject beserta jadwalnya menggunakan eager loading Subject::with('jadwal')->get(), kemudian mengembalikan view students.jadwal.
Tambahkan route baru GET /jadwal di routes/web.php yang mengarah ke method jadwal() pada StudentController.
Buat file resources/views/students/jadwal.blade.php yang menampilkan tabel jadwal seluruh mata kuliah. Data jadwal diakses melalui relasi One-to-One menggunakan $subject->jadwal->hari, $subject->jadwal->jam_mulai, dan seterusnya. Jika mata kuliah belum memiliki jadwal, ditampilkan teks "Belum ada jadwal".
Akses halaman jadwal di browser melalui http://127.0.0.1:8000/jadwal.
Pada bagian latihan ini, dibuat 4 query menggunakan Eloquent relationship yang diimplementasikan sebagai method baru di StudentController dan ditampilkan melalui satu view students/latihan.blade.php.
Ditambahkan method latihan() pada StudentController.php yang berisi 4 query sekaligus. Query pertama mengambil semua mahasiswa beserta jurusan dan mata kuliahnya menggunakan Student::with(['major', 'subjects'])->get(). Query kedua mencari jurusan dengan mahasiswa terbanyak menggunakan Major::withCount('students')->orderBy('students_count', 'desc')->first(). Query ketiga mengambil mata kuliah mahasiswa tertentu melalui relasi $student->subjects. Query keempat menghitung total SKS setiap mahasiswa menggunakan $student->subjects->sum('sks').
Ditambahkan route baru GET /latihan di routes/web.php yang mengarah ke method latihan() pada StudentController. Route ini ditempatkan sebelum Route::resource agar tidak tertimpa oleh route resource.
Buat file resources/views/students/latihan.blade.php yang menampilkan hasil keempat query dalam satu halaman, masing-masing dalam section terpisah.
Query 1 - Semua Mahasiswa beserta Jurusan dan Mata KuliahMenampilkan tabel yang memuat NIM, nama, jurusan (dari $student->major->name), dan daftar mata kuliah dalam badge (dari $student->subjects).
Menampilkan nama jurusan dan jumlah mahasiswanya menggunakan $majorTerbanyak->name dan $majorTerbanyak->students_count.
Menampilkan daftar mata kuliah yang diambil oleh mahasiswa tertentu menggunakan $matkul yang dikirim dari controller.
Menampilkan tabel nama mahasiswa beserta total SKS yang diambil menggunakan $student->subjects->sum('sks').
Akses http://127.0.0.1:8000/latihan di browser untuk melihat hasil keempat query ditampilkan dalam satu halaman.
Query 1 - Semua Mahasiswa beserta Jurusan dan Mata KuliahMenampilkan seluruh data mahasiswa lengkap dengan nama jurusan dan badge mata kuliah yang diambil masing-masing mahasiswa.
Menampilkan nama jurusan yang memiliki jumlah mahasiswa paling banyak beserta angkanya.
Menampilkan daftar mata kuliah beserta SKS yang diambil oleh mahasiswa dengan id tertentu.
Menampilkan tabel nama seluruh mahasiswa beserta total SKS yang diambil masing-masing.
Praktikum ini berhasil mengimplementasikan tiga jenis relationship Eloquent pada Laravel:
One-to-Many antara Major dan Student, Many-to-Many antara Student dan Subject melalui tabel pivot student_subject,
serta One-to-One antara Subject dan Jadwal pada bagian challenge.
Penggunaan eager loading dengan with() terbukti efisien karena menghindari query berulang saat mengakses data relationship di view.
Method attach() digunakan saat menambah data baru untuk menghubungkan mahasiswa ke mata kuliah,
sync() digunakan saat update agar data pivot selalu sesuai dengan pilihan terbaru,
dan detach() digunakan sebelum delete untuk membersihkan data pivot terlebih dahulu.
Pada relasi One-to-One, akses data dilakukan melalui $subject->jadwal yang otomatis menjalankan query ke tabel jadwals.
| Method | Fungsi | Digunakan pada |
|---|---|---|
| attach() | Menambah relasi Many-to-Many | store() |
| sync() | Memperbarui relasi (hapus lama, tambah baru) | update() |
| detach() | Menghapus semua relasi | destroy() |
| with() | Eager loading relationship | index(), show(), jadwal() |
| hasOne() | Relasi One-to-One dari sisi induk | Subject → Jadwal |
| belongsTo() | Relasi One-to-One dari sisi anak | Jadwal → Subject |
Berdasarkan praktikum yang telah dilakukan, dapat disimpulkan bahwa:
hasMany() pada sisi induk dan belongsTo() pada sisi anak.belongsToMany() pada kedua model yang terlibat, dengan tabel pivot sebagai penghubung.hasOne() pada sisi induk dan belongsTo() pada sisi anak, digunakan untuk menghubungkan Subject dengan Jadwal.with() efektif mencegah N+1 query problem saat mengakses data relationship.attach(), sync(), dan detach() memudahkan pengelolaan data pada relasi Many-to-Many.