Pemrograman Web

Laravel Relationship

Dokumentasi Praktikum Relationship pada Framework Laravel

Kembali ke Halaman Report

A. Pendahuluan

Modul praktikum ini membahas implementasi relationship dalam framework Laravel, yang merupakan konsep fundamental dalam pengembangan aplikasi web berbasis database. Pemahaman yang baik mengenai relasi antar entitas sangat penting untuk membangun sebuah sistem akademik yang efisien dan mudah untuk dikembangkan atau dipelihara pada masa depan. Pada praktikum ini, studi kasus yang digunakan berfokus pada sistem akademik sederhana yang melibatkan tiga entitas utama untuk saling dihubungkan, yaitu Student, Major, dan Subject.

Dalam memodelkan sistem akademik tersebut, terdapat beberapa jenis relasi yang diimplementasikan ke dalam struktur database. Entitas mahasiswa memiliki relasi Many-to-One terhadap entitas jurusan, yang berarti setiap mahasiswa tergabung dalam satu jurusan, sementara satu jurusan dapat menampung banyak mahasiswa dalam konsep One-to-Many. Selain itu, terdapat pula relasi Many-to-Many antara entitas mahasiswa dan mata kuliah, di mana seorang mahasiswa dapat mengambil banyak mata kuliah dan satu mata kuliah dapat diambil oleh banyak mahasiswa. Secara teknis, relasi tersebut dihubungkan melalui sebuah tabel pivot di dalam database.

B. Tujuan

Tujuan dari praktikum ini adalah:

  1. Mahasiswa diharapkan mampu memahami secara mendalam mengenai konsep relationship antar entitas di dalam framework Laravel.
  2. Mampu menerapkan relasi One-to-Many dan Many-to-Many secara langsung pada basis data sistem akademik.
  3. Menguasai langkah teknis pembuatan file migration yang melibatkan pengaturan foreign key pada tabel secara tepat.
  4. Mampu menggunakan fitur Eloquent relationship secara efektif dan efisien untuk mengeksekusi proses query data.
  5. Dapat menampilkan hasil data yang saling berelasi tersebut secara terstruktur pada antarmuka pengguna atau view.

C. Langkah-Langkah

Persiapan Awal

1. Struktur Database dan Relationship

Sebelum membuat migration, model, controller, dan view, terlebih dahulu ditentukan struktur relasi yang akan digunakan pada sistem akademik sederhana. Relasi yang digunakan adalah sebagai berikut:

  • Student belongs to Major, yaitu setiap mahasiswa terhubung ke satu jurusan dalam bentuk relasi Many-to-One.
  • Student belongs to many Subject through pivot table, yaitu setiap mahasiswa dapat mengambil banyak mata kuliah melalui tabel penghubung.
  • Major has many Student, yaitu satu jurusan dapat memiliki banyak mahasiswa dalam bentuk relasi One-to-Many.
  • Subject belongs to many Student through pivot table, yaitu satu mata kuliah dapat diambil oleh banyak mahasiswa melalui tabel penghubung.
2. ERD (Entity Relationship Diagram)

ERD digunakan untuk menggambarkan hubungan antar tabel sebelum sistem dibuat. Pada sistem ini, ERD menunjukkan hubungan antara tabel majors dan students, serta hubungan many-to-many antara students dan subjects melalui tabel pivot student_subject.

ERD Major dan Student ERD Student dan Subject

1. Membuat Migration

A. Migration untuk tabel majors

Ketik perintah berikut pada terminal untuk membuat migration tabel majors.

php artisan make:migration create_majors_table
Output perintah create_majors_table

Lalu isi file migration tersebut dengan struktur tabel majors.

Kode migration tabel majors

Kodingan tersebut berfungsi untuk membuat dan mengelola tabel bernama majors atau jurusan di dalam database secara otomatis. Di dalamnya terdapat dua fungsi utama, yaitu fungsi up() yang bertugas membuat struktur tabel baru yang terdiri dari tiga kolom, yaitu id, name, serta timestamps. Sementara itu, fungsi down() bertugas sebagai pembatal atau rollback yang akan menghapus tabel majors dari database apabila proses migrasi ingin dibatalkan.

B. Migration untuk tabel students

Ketik perintah berikut pada terminal untuk membuat migration tabel students.

php artisan make:migration create_students_table
Output perintah create_students_table

Lalu isi file migration tersebut dengan struktur tabel students.

Kode migration tabel students

Kodingan ini berfungsi untuk membuat tabel students di dalam database, lengkap dengan pengaturan relasi antar tabel. Melalui fungsi up(), tabel ini dikonfigurasi untuk memiliki kolom id sebagai kunci utama, kolom nim bertipe teks unik yang tidak boleh kembar, kolom name untuk nama, kolom address untuk alamat, serta kolom timestamps untuk mencatat waktu otomatis. Bagian paling penting adalah kolom major_id yang bertindak sebagai foreign key untuk menghubungkan tabel mahasiswa dengan tabel jurusan. Jika data jurusan dihapus, maka data mahasiswa yang terikat pada jurusan tersebut juga otomatis ikut terhapus melalui pengaturan cascade.

C. Migration untuk tabel subjects

Ketik perintah berikut pada terminal untuk membuat migration tabel subjects.

php artisan make:migration create_subjects_table
Output perintah create_subjects_table

Lalu isi file migration tersebut dengan struktur tabel subjects.

Kode migration tabel subjects

Kodingan ini berfungsi untuk membuat tabel baru bernama subjects di dalam database. Melalui fungsi up(), tabel ini dikonfigurasi untuk memiliki empat kolom utama, yaitu id sebagai primary key, name sebagai nama mata kuliah, sks bertipe integer untuk menyimpan bobot SKS, dan timestamps untuk mencatat waktu pembuatan serta pembaruan data secara otomatis. Fungsi down() digunakan sebagai perintah pembatalan yang akan menghapus tabel subjects beserta isinya apabila proses migrasi ingin dibatalkan.

D. Migration untuk tabel pivot student_subject

Ketik perintah berikut pada terminal untuk membuat migration tabel pivot student_subject.

php artisan make:migration create_student_subject_table
Output perintah create_student_subject_table

Lalu isi file migration tersebut dengan struktur tabel pivot student_subject.

Kode migration tabel student_subject

Kodingan ini berfungsi untuk membuat tabel penghubung bernama student_subject yang menangani relasi many-to-many antara mahasiswa dan mata kuliah. Di dalam fungsi up(), tabel ini dikonfigurasi dengan kolom id, timestamps, serta dua foreign key yaitu student_id dan subject_id yang dilengkapi aturan onDelete('cascade'). Aturan tersebut membuat data pada tabel penghubung otomatis terhapus jika data mahasiswa atau mata kuliah terkait dihapus. Selain itu, terdapat baris aturan unique(['student_id', 'subject_id']) yang berfungsi mencegah satu mahasiswa mengambil mata kuliah yang sama lebih dari satu kali.

E. Menjalankan migration

Setelah seluruh file migration selesai dibuat, jalankan perintah berikut pada terminal.

php artisan migrate
Output menjalankan migration

2. Membuat Model dengan Relationship

A. Model Major

Ketik perintah berikut pada terminal untuk membuat model Major.

php artisan make:model Major
Output pembuatan model Major

Lalu isi model Major dengan relasi yang dibutuhkan.

Kode model Major

Kodingan ini berfungsi sebagai representasi dan pengatur interaksi data untuk tabel majors di dalam database. Di dalam kelas ini, properti protected $fillable = ['name'] digunakan untuk memberikan izin keamanan massal sehingga sistem hanya mengizinkan kolom name yang dapat diisi atau diubah secara langsung oleh pengguna. Selain itu, model ini mendefinisikan fungsi students() dengan relasi hasMany(Student::class), yang berarti model Major memiliki hubungan One-to-Many dengan model Student. Aturan ini menjelaskan bahwa satu jurusan dapat memiliki atau menampung banyak mahasiswa sekaligus di dalam sistem aplikasi.

B. Model Student

Ketik perintah berikut pada terminal untuk membuat model Student.

php artisan make:model Student
Output pembuatan model Student

Lalu isi model Student dengan relasi ke Major dan Subject.

Kode model Student

Kodingan ini berfungsi untuk mengelola data tabel mahasiswa di database serta mendefinisikan hubungan ke tabel lainnya. Melalui properti protected $fillable, model ini memberikan izin pengisian massal agar kolom nim, name, address, dan major_id bisa disimpan secara langsung oleh sistem. Selain itu, kelas ini mendefinisikan dua jenis relasi, yaitu fungsi major() menggunakan belongsTo(Major::class) untuk menunjukkan hubungan Many-to-One, sedangkan fungsi subjects() menggunakan belongsToMany(Subject::class) untuk mengatur relasi Many-to-Many antara mahasiswa dan mata kuliah.

C. Model Subject

Ketik perintah berikut pada terminal untuk membuat model Subject.

php artisan make:model Subject
Output pembuatan model Subject

Lalu isi model Subject dengan relasi ke Student.

Kode model Subject

Kodingan ini merepresentasikan tabel mata kuliah di dalam database untuk mengatur manipulasi data dan relasinya. Properti protected $fillable = ['name', 'sks'] berfungsi sebagai pengaman data agar hanya kolom nama mata kuliah dan bobot SKS saja yang diizinkan untuk diisi secara massal oleh sistem. Di samping itu, model ini menyediakan fungsi students() yang menggunakan metode belongsToMany(Student::class) untuk mendefinisikan hubungan Many-to-Many, sehingga sebuah mata kuliah dapat diambil oleh banyak mahasiswa dan secara otomatis terhubung timbal balik melalui tabel perantara.

3. Seeder untuk Data Sample

A. Seeder untuk Major

Ketik perintah berikut pada terminal untuk membuat MajorSeeder.

php artisan make:seeder MajorSeeder
Output pembuatan MajorSeeder

Lalu isi file MajorSeeder dengan data jurusan.

Kode MajorSeeder

Kodingan ini berfungsi untuk mengisi data awal atau data tiruan ke dalam tabel majors secara otomatis. Di dalam fungsi run(), terdapat sebuah array bernama majors yang menampung beberapa nama jurusan, yaitu Teknik Informatika, Sistem Informasi, Teknik Komputer, dan Manajemen Informatika. Kodingan ini kemudian menggunakan perulangan foreach untuk membaca setiap nama jurusan tersebut satu per satu dan langsung memasukkannya ke database menggunakan perintah Major::create().

B. Seeder untuk Subject

Ketik perintah berikut pada terminal untuk membuat SubjectSeeder.

php artisan make:seeder SubjectSeeder
Output pembuatan SubjectSeeder

Lalu isi file SubjectSeeder dengan data mata kuliah.

Kode SubjectSeeder

Kodingan ini digunakan untuk mengisi data awal mata kuliah ke dalam tabel subjects. Setiap data mata kuliah berisi nama mata kuliah dan jumlah SKS. Seeder ini membantu proses pengujian karena sistem langsung memiliki data mata kuliah tanpa harus memasukkan data satu per satu melalui database secara manual.

C. Seeder untuk Student

Ketik perintah berikut pada terminal untuk membuat StudentSeeder.

php artisan make:seeder StudentSeeder
Output pembuatan StudentSeeder

Lalu isi file StudentSeeder dengan data mahasiswa dan relasi mata kuliah.

Kode StudentSeeder

Kodingan ini berfungsi untuk mengisi data simulasi mahasiswa sekaligus menghubungkannya dengan mata kuliah secara otomatis ke dalam database. Di dalam fungsi run(), kode menyiapkan sebuah array students yang berisi beberapa data mahasiswa lengkap dengan NIM, nama, alamat, dan major_id untuk menentukan jurusan mereka. Menggunakan perulangan foreach, setiap data mahasiswa dimasukkan ke database melalui perintah Student::create(). Selanjutnya, kode mengambil antara dua sampai empat ID mata kuliah secara acak dari tabel subjects, lalu menempelkannya ke setiap mahasiswa menggunakan perintah attach(). Dengan cara ini, setelah seeder dijalankan, database langsung memiliki data mahasiswa yang sudah otomatis mengambil beberapa mata kuliah.

D. Update DatabaseSeeder

Buka file DatabaseSeeder.php, lalu panggil seluruh seeder yang sudah dibuat.

Kode DatabaseSeeder

Kodingan ini berfungsi sebagai pusat pengendali untuk menjalankan semua file seeder secara terpusat dan berurutan. Di dalam fungsi run(), terdapat perintah $this->call([...]) yang mengeksekusi tiga kelas seeder utama. Pertama, MajorSeeder dijalankan untuk mengisi data jurusan. Kedua, SubjectSeeder dijalankan untuk mengisi data mata kuliah. Ketiga, StudentSeeder dijalankan untuk mengisi data mahasiswa beserta relasi mata kuliahnya. Urutan eksekusi ini dibuat sangat terstruktur agar tidak terjadi error relasi database.

E. Jalankan seeder

Jalankan perintah berikut pada terminal untuk mengisi database dengan data sample.

php artisan db:seed
Output menjalankan seeder

4. Membuat Controller

A. StudentController

Ketik perintah berikut pada terminal untuk membuat StudentController.

php artisan make:controller StudentController
Output pembuatan StudentController

Lalu isi controller dengan logic CRUD dan relationship.

Kode StudentController bagian pertama Kode StudentController bagian kedua

Kodingan tersebut berfungsi sebagai pengatur logika utama untuk melakukan operasi CRUD lengkap dengan relasi jurusan dan mata kuliahnya. Di dalamnya terdapat fungsi index() dan show() untuk menampilkan semua data atau detail satu mahasiswa menggunakan teknik eager loading with() agar performa query lebih efisien. Fungsi create() dan edit() digunakan untuk memanggil halaman formulir beserta pilihan data jurusan dan mata kuliah yang tersedia, sedangkan fungsi store() dan update() bertugas memvalidasi input, menyimpan atau memperbarui data mahasiswa, sekaligus menyinkronkan mata kuliah yang dipilih ke tabel perantara menggunakan attach() atau sync(). Terakhir, fungsi destroy() berfungsi menghapus mahasiswa dari database setelah terlebih dahulu memutuskan hubungan mata kuliah menggunakan detach().

5. Membuat Routes

Buka file web.php, lalu isi dengan routing yang mengarah ke StudentController.

Kode routes web.php

Kodingan ini berfungsi untuk mengatur alamat URL web dan mengarahkan pengguna ke halaman yang tepat. Di dalamnya terdapat dua pengaturan utama. Pertama, perintah Route::get('/', ...) mengatur agar ketika pengguna membuka halaman utama atau beranda web, sistem langsung mengalihkan mereka secara otomatis ke halaman daftar mahasiswa atau route students.index. Kedua, perintah Route::resource('students', StudentController::class) secara otomatis membuat paket route lengkap untuk kebutuhan CRUD yang langsung terhubung ke fungsi-fungsi terkait di dalam StudentController.

6. Membuat Views

A. Layout utama

Buat folder baru di dalam folder views dengan nama layouts. Di dalam folder layouts, buat file baru dengan nama app.blade.php, lalu isi dengan struktur layout utama.

Kode layout app.blade.php

Kodingan ini berfungsi sebagai kerangka dasar tampilan web agar desain aplikasi tetap konsisten di setiap halaman. Di dalam kode HTML ini terdapat integrasi framework Bootstrap melalui CDN untuk mengatur tampilan visual, navbar sederhana untuk identitas aplikasi, serta blok utama @yield('content') yang berfungsi sebagai tempat menempelkan konten dinamis dari halaman lain. Dengan menggunakan layout ini, setiap halaman anak dapat menggunakan struktur HTML yang sama tanpa perlu menulis ulang navbar dan kerangka dasar dari awal.

B. Index Students

Buat folder baru di dalam folder views dengan nama students. Di dalam folder students, buat file baru dengan nama index.blade.php untuk menampilkan daftar mahasiswa.

Kode index.blade.php

Kodingan ini berfungsi untuk menampilkan halaman daftar mahasiswa dalam bentuk tabel yang rapi dan interaktif. Di bagian atas halaman terdapat tombol Tambah Mahasiswa untuk mengarahkan pengguna ke formulir input baru. Bagian tabel menggunakan perulangan foreach untuk memunculkan data setiap mahasiswa satu per satu, mulai dari NIM, nama, nama jurusan, daftar mata kuliah yang diambil, hingga total SKS yang dihitung otomatis. Di kolom kanan tabel disediakan tombol aksi CRUD lengkap, yaitu tombol Detail, Edit, dan Hapus dengan perlindungan CSRF serta konfirmasi agar data tidak terhapus secara tidak sengaja.

C. Create Student

Buat file baru di dalam folder students dengan nama create.blade.php untuk menampilkan formulir tambah data mahasiswa.

Kode create.blade.php bagian pertama Kode create.blade.php bagian kedua

Kodingan ini berfungsi untuk menampilkan halaman formulir pendaftaran atau tambah data mahasiswa baru. Formulir ini menyediakan kolom isian teks untuk NIM, nama, dan alamat, kolom pilihan untuk menentukan jurusan, serta pilihan kotak centang untuk mengambil beberapa mata kuliah sekaligus. Formulir dirancang aman dan interaktif karena menyertakan proteksi CSRF, fitur penahan input lama melalui old(), serta deteksi validasi error otomatis yang akan menampilkan pesan kesalahan di bawah kolom yang belum diisi secara benar saat tombol Simpan ditekan.

D. Detail Student

Buat file baru di dalam folder students dengan nama detail.blade.php untuk menampilkan informasi detail mahasiswa.

Kode detail.blade.php

Kodingan berfungsi untuk menampilkan halaman profil atau informasi detail dari seorang mahasiswa secara spesifik. Dengan mewarisi kerangka utama dari layouts.app, halaman ini menampilkan data pribadi mahasiswa seperti nama, NIM, jurusan, dan alamat. Bagian yang menarik adalah penggunaan logika foreach untuk mendeteksi daftar mata kuliah yang diambil mahasiswa. Jika ada, sistem akan menampilkan satu per satu dalam bentuk label, lengkap dengan bobot SKS. Jika tidak ada mata kuliah, maka sistem akan menampilkan keterangan bahwa data mata kuliah belum tersedia. Halaman ini juga dilengkapi tombol Edit dan Kembali.

E. Edit Student

Buat file baru di dalam folder students dengan nama edit.blade.php untuk menampilkan formulir pembaruan data mahasiswa.

Kode edit.blade.php bagian pertama Kode edit.blade.php bagian kedua

Kodingan ini berfungsi untuk menampilkan form pembaruan data mahasiswa yang sudah ada di database. Memiliki struktur yang mirip dengan formulir tambah data, halaman ini secara cerdas langsung mengisi setiap kolom input dengan data lama milik mahasiswa tersebut yang diambil dari database menggunakan kombinasi old() dan nilai data asli. Formulir ini dikirim menggunakan metode POST namun dimanipulasi dengan @method('PUT') sesuai standar RESTful API Laravel untuk proses update data. Validasi dan CSRF tetap digunakan agar pembaruan data berjalan aman dan terkontrol.

Output

Setelah seluruh migration, model, seeder, controller, route, dan view selesai dibuat, aplikasi dapat dijalankan untuk menampilkan sistem manajemen mahasiswa sederhana. Sistem dapat menampilkan daftar mahasiswa, menambah data mahasiswa baru, menyimpan relasi jurusan dan mata kuliah, menampilkan detail mahasiswa, mengubah data mahasiswa, serta menghapus data dengan konfirmasi.

Output daftar mahasiswa Output tambah mahasiswa Output daftar mahasiswa setelah data ditambahkan Output data mahasiswa pada database Output detail mahasiswa Output edit mahasiswa Output konfirmasi hapus data mahasiswa

Latihan dan Tugas

Latihan pada praktikum ini adalah membuat query untuk menampilkan:

  • Semua mahasiswa beserta jurusan dan mata kuliahnya.
  • Jurusan yang memiliki mahasiswa terbanyak.
  • Mata kuliah yang diambil oleh mahasiswa tertentu.
  • Total SKS yang diambil oleh setiap mahasiswa.
Langkah 1: Memperbarui StudentController

Buka file StudentController.php yang berada di dalam folder app/Http/Controllers/. Pada fungsi index(), perbarui query menggunakan metode eager loading with() untuk memuat relasi major dan subjects secara bersamaan guna menghindari masalah N+1 query. Tambahkan juga metode withSum() untuk menghitung total SKS langsung dari basis data, serta withCount() untuk mencari jurusan dengan jumlah mahasiswa terbanyak. Seluruh hasil query tersebut kemudian dikirimkan ke view menggunakan fungsi compact().

Kode StudentController untuk latihan bagian pertama Kode StudentController untuk latihan bagian kedua

Kodingan ini merupakan file StudentController di Laravel yang telah dimodifikasi pada fungsi index() untuk menyatukan pengolahan seluruh data logika CRUD mahasiswa dan query relasi dalam satu halaman tampilan. Di dalam fungsi index(), kode ini mengambil seluruh mahasiswa menggunakan eager loading with() dan menghitung total akumulasi SKS mereka secara otomatis melalui perintah withSum(). Selain itu, controller juga mencari jurusan dengan mahasiswa terbanyak, mencari mata kuliah yang diambil oleh mahasiswa tertentu, serta mengirim seluruh data hasil query tersebut ke halaman students.index menggunakan compact().

Langkah 2: Memperbarui index.blade.php

Buka file index.blade.php yang berada di dalam folder resources/views/students/. Tambahkan komponen antarmuka baru menggunakan class card atau alert bawaan Bootstrap di atas tabel utama untuk menampilkan hasil query jurusan terbanyak dan mata kuliah mahasiswa tertentu. Selanjutnya, sesuaikan baris kode pada kolom Total SKS di dalam tabel agar mencetak nilai yang dihasilkan langsung dari controller, sehingga proses pemuatan data menjadi lebih optimal.

Kode index.blade.php untuk latihan bagian pertama Kode index.blade.php untuk latihan bagian kedua

Kodingan ini adalah file Blade view index.blade.php yang telah diperbarui untuk menampilkan halaman daftar utama mahasiswa sekaligus menyajikan visualisasi data hasil query tugas latihan dalam bentuk komponen Bootstrap. Pada bagian atas, halaman menampilkan informasi khusus berupa jurusan yang memiliki jumlah mahasiswa terbanyak dan daftar mata kuliah yang diambil oleh mahasiswa tertentu. Sementara itu, data seluruh mahasiswa tetap ditampilkan dalam bentuk tabel interaktif dengan kolom SKS yang langsung memanggil variabel hasil hitung dari controller lewat perintah total_sks. Dengan demikian, halaman menjadi lebih informatif, rapi, dan optimal.

Output latihan
Output hasil latihan query relationship

D. Kesimpulan

Melalui pelaksanaan praktikum ini, telah berhasil dipelajari dan diimplementasikan langkah-langkah mendasar dalam membuat relasi One-to-Many dan Many-to-Many pada framework Laravel. Proses ini melibatkan pemahaman teknis yang komprehensif mengenai implementasi foreign key pada struktur tabel serta pembuatan pivot table khusus untuk menangani relasi antar entitas yang saling terhubung. Selain berfokus pada penyusunan struktur basis data, praktikum ini juga memberikan pemahaman tentang bagaimana menggunakan fitur Eloquent relationship untuk mengeksekusi query data secara lebih efisien dibandingkan metode query konvensional.

Pengerjaan modul ini juga menekankan penerapan praktik terbaik dalam pengembangan aplikasi, khususnya mengenai penggunaan metode eager loading untuk mengoptimalkan kinerja sistem guna menghindari masalah inefisiensi saat memuat data. Seluruh proses pengelolaan basis data dan penulisan logika kode tersebut pada akhirnya diintegrasikan untuk menampilkan data yang saling berelasi dengan baik pada halaman view pengguna. Secara keseluruhan, penguasaan terhadap konsep fundamental relasi ini terbukti sangat penting dalam mendukung proses perancangan dan pembangunan aplikasi web yang efisien, terstruktur, serta mudah dikelola.

Lihat Repository GitHub