Implementasi Relationship dalam Laravel
1. Buat projek baru laravel pada perangkat anda yang mana sudah dijelaskan pada blog sebelumnya
Link https://hafiz.infokand23.my.id/index.php?page=blog3
2. Setelah projek laravel berhasil dibuat, langkah selanjutnya yang harus dilakukan adalah membuat migration untuk tabel majors, yang akan menyimpan data jurusan.
Buka terminal atau Command Prompt (cmder), arahkan ke direktori project Laravel Anda, lalu jalankan perintah artisan berikut:
Perintah ini akan menghasilkan file migration baru yang terletak di dalam folder database/migrations dengan nama xxxx_xx_xx_create_majors_table.php. Buka file tersebut, lalu ubah isinya menjadi seperti berikut:
Penjelasan kode:
$table->id(): Membuat kolom ID sebagai primary key bertipe big integer dan auto increment.$table->string('name'): Kolomnamedigunakan untuk menyimpan nama jurusan.$table->timestamps(): Menambahkan kolomcreated_atdanupdated_atsecara otomatis.
Setelah itu, jalankan perintah berikut untuk mengeksekusi migration:
Jika berhasil, maka tabel majors akan dibuat di database sesuai struktur di atas.
3. Setelah kita membuat migration untuk tabel majors pada langkah sebelumnya, sekarang kita akan melanjutkan dengan membuat tabel students. Tabel ini akan menyimpan data mahasiswa dan memiliki relasi ke tabel majors.
Silakan buka terminal dan jalankan perintah berikut:
Setelah itu, buka file migration yang telah dibuat di folder database/migrations dan ubah isinya menjadi seperti berikut:
Penjelasan struktur tabel:
$table->id(): Membuat kolom primary key otomatis bernamaid.$table->string('nim')->unique(): Menyimpan NIM mahasiswa dan harus unik.$table->string('name'): Menyimpan nama lengkap mahasiswa.$table->text('address'): Menyimpan alamat mahasiswa.$table->foreignId('major_id'): Membuat relasi ke tabelmajors, yang akan otomatis menghapus data mahasiswa jika jurusan terkait dihapus (onDelete('cascade')).$table->timestamps(): Menambahkan kolomcreated_atdanupdated_at.
Setelah selesai membuat migration, jalankan perintah berikut untuk mengeksekusi migration dan membuat tabel students di database:
Jika perintah berhasil, maka struktur tabel students akan otomatis terbentuk di database beserta relasinya ke tabel majors.
4. Pada langkah ini, kita akan membuat tabel subjects yang digunakan untuk menyimpan data mata pelajaran atau mata kuliah. Tabel ini akan berisi informasi nama dan jumlah SKS (Satuan Kredit Semester) dari masing-masing mata pelajaran.
Silakan jalankan perintah berikut di terminal untuk membuat migration:
Setelah perintah dijalankan, buka file migration yang terletak di direktori database/migrations, lalu ubah isinya menjadi seperti berikut:
Penjelasan struktur tabel:
$table->id(): Membuat kolom ID sebagai primary key.$table->string('name'): Menyimpan nama mata pelajaran atau mata kuliah.$table->integer('sks'): Menyimpan jumlah SKS untuk mata pelajaran tersebut.$table->timestamps(): Menambahkan kolom waktucreated_atdanupdated_at.
Setelah itu, jalankan perintah migration untuk menambahkan tabel subjects ke dalam database:
php artisan migrate
Jika berhasil, maka tabel subjects akan otomatis tersedia di database kamu, siap untuk digunakan dalam proses manajemen data mata kuliah.
5. Membuat Migration untuk Tabel Pivot student_subject
Dalam aplikasi manajemen mahasiswa dan mata kuliah, kita perlu menghubungkan data mahasiswa (students) dengan mata kuliah (subjects) yang mereka ambil. Karena satu mahasiswa bisa mengambil banyak mata kuliah, dan satu mata kuliah bisa diambil oleh banyak mahasiswa, maka kita memerlukan relasi many-to-many.
Laravel menangani relasi many-to-many ini menggunakan tabel pivot, yaitu tabel khusus yang hanya berisi referensi antar kedua tabel utama. Nama tabel pivot konvensional mengikuti format nama_tabel1_nama_tabel2, sehingga dalam kasus ini tabel tersebut bernama student_subject.
Jalankan perintah berikut di terminal:
Perintah ini akan menghasilkan file migration baru di dalam folder database/migrations. Cari file dengan nama create_student_subject_table.php (tanggal dan waktunya bisa berbeda).
Buka file tersebut, lalu ubah kodenya menjadi seperti berikut:
Penjelasan Kode:
$table->id(): Kolom primary key untuk tabel pivot (opsional, tapi berguna untuk identifikasi data jika dibutuhkan).student_id: Merujuk ke kolomiddari tabelstudents. Menggunakanconstrained('students')agar otomatis terhubung dan validasi foreign key dilakukan oleh Laravel. Jika data mahasiswa dihapus, maka otomatis data pivot yang berkaitan juga dihapus (onDelete('cascade')).subject_id: Merujuk ke kolomiddari tabelsubjectsdengan prinsip yang sama.$table->unique(['student_id', 'subject_id']): Mencegah entri duplikat seperti mahasiswa yang sama mengambil mata kuliah yang sama lebih dari sekali.$table->timestamps(): Mencatat waktu kapan mahasiswa mengambil mata kuliah tersebut (berguna untuk pelacakan).
Setelah selesai menulis file migration, jalankan perintah berikut di terminal untuk membuat tabel pivot di dalam database:
php artisan migrate
Jika berhasil, maka tabel student_subject akan muncul di database, lengkap dengan relasi antar students dan subjects.
Catatan Tambahan:
Tabel pivot ini akan sangat berguna saat kamu ingin menampilkan daftar mata kuliah yang diambil oleh seorang mahasiswa, atau daftar mahasiswa yang mengambil mata kuliah tertentu, dengan menggunakan fitur belongsToMany() dari Eloquent ORM Laravel.
6. Membuat Model Major
Pada langkah ini, kita akan membuat model Major untuk mewakili data jurusan pada aplikasi. Model ini akan digunakan untuk menghubungkan data mahasiswa dengan jurusannya melalui relasi One to Many.
Jalankan perintah berikut di terminal untuk membuat model:
Perintah ini akan menghasilkan file Major.php di dalam folder app/Models.
Buka file app/Models/Major.php dan ubah isinya menjadi seperti berikut:
Penjelasan Kode:
use HasFactory;: Digunakan untuk mendukung fitur Factory pada Laravel jika diperlukan.protected $fillable = ['name'];: Menentukan bahwa fieldnamebisa diisi melalui proses mass assignment (misalnya melalui form ataucreate()).students(): Mendefinisikan relasihasMany, artinya satu jurusan bisa memiliki banyak mahasiswa. Relasi ini menghubungkan modelMajordengan modelStudent.
Catatan:
Relasi hasMany() ini akan sangat berguna saat kita ingin menampilkan semua mahasiswa dari suatu jurusan, misalnya dengan query seperti:
$major = Major::with('students')->find(1);
Dengan kode di atas, kita bisa mendapatkan semua mahasiswa yang terdaftar di jurusan dengan id = 1.
7. Membuat Model Student
Pada langkah ini, kita akan membuat model Student untuk mewakili data mahasiswa. Model ini akan memiliki relasi dengan dua model lain, yaitu Major (jurusan) dan Subject (mata kuliah).
Jalankan perintah berikut di terminal untuk membuat model:
Perintah ini akan menghasilkan file Student.php di dalam folder app/Models.
Buka file app/Models/Student.php dan ubah isinya menjadi seperti berikut:
Penjelasan Kode:
protected $fillable: Mengizinkan atributnim,name,address, danmajor_iduntuk diisi melalui form atau metode mass assignment lainnya.major(): Mendefinisikan relasibelongsTo, yaitu satu mahasiswa hanya berasal dari satu jurusan (relasi Many to One).subjects(): Mendefinisikan relasibelongsToMany, artinya satu mahasiswa bisa mengambil banyak mata kuliah. Laravel secara otomatis akan menggunakan tabel pivotstudent_subjectuntuk mengelola relasi ini.
Contoh Penggunaan Relasi:
Dengan relasi yang sudah dibuat, kamu bisa melakukan query seperti berikut:
// Mengambil mahasiswa beserta nama jurusannya
$student = Student::with('major')->find(1);
// Mengambil mahasiswa beserta semua mata kuliah yang diambil
$student = Student::with('subjects')->find(1);
8. Membuat Model Subject
Pada tahap ini, kita akan membuat model Subject untuk merepresentasikan entitas mata kuliah. Model ini akan berelasi banyak ke banyak (Many to Many) dengan model Student, karena satu mata kuliah bisa diambil oleh banyak mahasiswa, dan satu mahasiswa bisa mengambil banyak mata kuliah.
Buka terminal dan jalankan perintah berikut untuk membuat model:
Perintah ini akan menghasilkan file baru bernama Subject.php di dalam folder app/Models.
Edit file app/Models/Subject.php menjadi seperti berikut:
Penjelasan:
use HasFactory: Digunakan agar model ini bisa bekerja dengan fitur factory Laravel.protected $fillable: Digunakan untuk menentukan kolom mana saja yang bisa diisi secara massal (mass assignment).students(): Metode ini mendefinisikan relasi many-to-many dengan modelStudent. Laravel secara otomatis menggunakan tabel pivotstudent_subjectberdasarkan penamaan konvensi.
9. Membuat Seeder Data Awal untuk Jurusan (majors)
Seeder digunakan untuk mengisi tabel database secara otomatis dengan data awal. Dalam kasus ini, kita akan menambahkan beberapa jurusan ke tabel majors.
Jalankan perintah berikut di terminal:
Perintah di atas akan membuat file MajorSeeder.php di dalam folder database/seeders.
Buka file database/seeders/MajorSeeder.php dan ubah isinya menjadi seperti berikut:
Penjelasan:
- Kita mendefinisikan array
$majorsyang berisi data jurusan. - Dengan menggunakan perulangan
foreach, setiap jurusan akan dimasukkan ke database melalui modelMajor.
Terakhir, jalankan seeder dengan perintah:
php artisan db:seed
Setelah perintah di atas dijalankan, maka data jurusan akan otomatis terisi ke dalam tabel majors.
10. Membuat Seeder untuk Tabel subjects
Seeder ini digunakan untuk mengisi tabel subjects dengan daftar mata kuliah awal. Setiap mata kuliah memiliki nama dan jumlah SKS (Satuan Kredit Semester).
File akan berada di: database/seeders/SubjectSeeder.php.
Penjelasan:
- Variabel
$subjectsberisi array data mata kuliah awal. - Setiap elemen array memiliki atribut
namedansks. - Mata kuliah dimasukkan ke dalam tabel
subjectsmenggunakan methodSubject::create().
11. Membuat Seeder untuk Tabel students
Seeder ini digunakan untuk mengisi tabel students dengan data awal mahasiswa. Setiap mahasiswa memiliki NIM, nama, alamat, dan jurusan. Selain itu, mahasiswa juga akan diberikan mata kuliah secara acak.
File akan berada di: database/seeders/StudentSeeder.php
Penjelasan:
- Array
$studentsmenyimpan data mahasiswa awal, termasuknim,name,address, danmajor_id. - Setiap mahasiswa dibuat menggunakan method
Student::create(). - Setelah dibuat, mahasiswa diberi beberapa mata kuliah secara acak melalui relasi many-to-many
subjects()dan methodattach().
12. Update Seeder Utama (DatabaseSeeder.php)
File DatabaseSeeder merupakan file utama yang akan menjalankan semua seeder yang telah dibuat sebelumnya, yaitu untuk tabel majors, subjects, dan students.
Buka dan Ubah File DatabaseSeeder.php
Penjelasan:
- Method
run()digunakan untuk memanggil seluruh seeder yang ingin dijalankan. $this->call([...])berisi daftar seeder yang dijalankan secara berurutan:- MajorSeeder – Mengisi tabel
majors - SubjectSeeder – Mengisi tabel
subjects - StudentSeeder – Mengisi tabel
studentsdan relasi kesubjects
- MajorSeeder – Mengisi tabel
Menjalankan Semua Seeder
Setelah menjalankan perintah di atas, maka:
- Data jurusan akan masuk ke tabel
majors. - Data mata kuliah akan masuk ke tabel
subjects. - Data mahasiswa akan masuk ke tabel
students, dan masing-masing mahasiswa akan memiliki mata kuliah (relasi many-to-many di tabelstudent_subject).
13. Membuat Controller untuk Mahasiswa (StudentController)
Controller digunakan untuk menangani logika alur data dari dan ke database, serta mengatur tampilan yang ditampilkan ke pengguna.
Membuat File Controller
Perintah ini akan menghasilkan file StudentController.php di direktori app/Http/Controllers/.
Isi Lengkap StudentController
Penjelasan:
index(): Menampilkan semua mahasiswa beserta relasi jurusan dan mata kuliah.show($id): Menampilkan detail lengkap mahasiswa berdasarkan ID.create(): Menampilkan form input mahasiswa baru, beserta daftar jurusan dan mata kuliah.store(Request $request): Menyimpan mahasiswa baru dan relasi ke mata kuliah.edit($id): Menampilkan form edit data mahasiswa beserta data awal.update(Request $request, $id): Menyimpan perubahan data mahasiswa dan update relasi.destroy($id): Menghapus mahasiswa dari database dan menghapus relasi dengan subjects.
14. Menentukan Routing Aplikasi
Routing digunakan untuk mengatur bagaimana permintaan URL diarahkan ke controller dan metode tertentu. Laravel menggunakan sistem routing berbasis file yang didefinisikan di dalam routes/web.php.
Buka File Routing
File yang digunakan untuk mendefinisikan rute adalah:
routes/web.php
Isi File Routing
Penjelasan:
Route::get('/', ...): Mengatur agar saat user mengakses halaman root (/), mereka langsung diarahkan ke halaman daftar mahasiswa.Route::resource('students', StudentController::class): Secara otomatis membuat semua rute standar untuk operasi CRUD (Create, Read, Update, Delete) mahasiswa. Termasuk rute seperti:GET /students→index()GET /students/create→create()POST /students→store()GET /students/{id}→show()GET /students/{id}/edit→edit()PUT/PATCH /students/{id}→update()DELETE /students/{id}→destroy()
15. Membuat Layout Utama Aplikasi
File layout utama bertugas sebagai kerangka dasar tampilan halaman yang akan digunakan kembali di setiap halaman seperti daftar mahasiswa, form tambah/edit, dan detail mahasiswa. Dengan menggunakan konsep @yield dan @section dari Blade Laravel, kita dapat menyisipkan konten spesifik ke dalam layout ini.
Buat file layout di:
resources/views/layouts/app.blade.php
Isi File Layout
Penjelasan:
- File ini menggunakan Bootstrap 5 sebagai framework CSS untuk tampilan antarmuka.
- Bagian
@yield('content')akan diisi oleh konten dari file tampilan anak (misalnya:index.blade.php,create.blade.php, dst). @if(session('success'))digunakan untuk menampilkan pesan flash ketika suatu aksi berhasil dijalankan (misalnya: tambah/update/delete data).
16. Menampilkan Daftar Mahasiswa
File ini akan menampilkan seluruh data mahasiswa dalam bentuk tabel, termasuk informasi jurusan, mata kuliah yang diambil, dan total SKS. Terdapat juga tombol aksi untuk detail, edit, dan hapus.
Lokasi File
Isi File
Penjelasan:
@extends('layouts.app'): Menggunakan layout utama yang telah dibuat sebelumnya.- Header halaman: Menampilkan judul dan tombol tambah mahasiswa.
- Tabel mahasiswa:
- Menampilkan data: NIM, Nama, Jurusan, Mata Kuliah (dengan badge), dan Total SKS.
- Total SKS dihitung dengan
$student->subjects->sum('sks').
- Aksi: Terdapat 3 tombol:
Detail: Menuju halaman detail mahasiswa.Edit: Menuju halaman edit data mahasiswa.Hapus: Menghapus data mahasiswa dengan konfirmasi.
17. Form Tambah Mahasiswa
Halaman ini digunakan untuk menambahkan data mahasiswa baru, termasuk memilih jurusan dan mata kuliah yang diambil.
Lokasi File
resources/views/students/create.blade.php
Isi File
Penjelasan:
- CSRF Protection: Gunakan
@csrfuntuk keamanan form. - Input Validasi: Menggunakan
@erroruntuk menampilkan pesan error pada masing-masing field. - Jurusan: Dropdown yang menampilkan semua jurusan dari database.
- Mata Kuliah: Daftar checkbox dari seluruh mata kuliah yang bisa diambil mahasiswa.
- Tombol Aksi:
Simpan: Menyimpan data mahasiswa ke database.Kembali: Kembali ke halaman index mahasiswa.
Untuk mengakses projek yang sudah kita buat buka link berikut di browser yang kita gunakan http://127.0.0.1:8000/students
Untuk tampilan bagian Tambah mahasiswa adalah sebagai berikut
Ketika berhasil ditambahka akan muncul alert seperti berikut
Untuk membuat tombol pada tabel tersebut memiliki fungsi langkah yang akan kita kerjakan adalah
1. Buat terlebih dahulu file untuk menmpung fungsi dari masing masing tombol
2. Untuk bagian edit.blade.php masukan kode beikut
Tampilannya akan seperti berikut
3. Untuk menampilkan Jurusan yang memiliki mahasiswa terbanyak disini saya menembahkan satu tombol lagi pada bagian index.blade.php
4. Lalu pada bagian StudentControllr.php tambahkan kode berikut
Penjelasan:
-
$students = Student::with(['major', 'subjects'])->get();
Mengambil semua data mahasiswa beserta relasi ke tabelmajorsdansubjects. -
$popularMajor = Major::withCount('students')->orderByDesc('students_count')->first();
Mengambil jurusan yang memiliki jumlah mahasiswa terbanyak menggunakanwithCount(). -
$selectedStudentId = $request->input('student_id');
Mengambil nilaistudent_idyang dikirim dari input form atau query string. -
$selectedStudent = Student::with('subjects')->find($selectedStudentId) ?? $students->first();
Mencari mahasiswa berdasarkan ID yang dipilih. Jika tidak ditemukan, maka ambil mahasiswa pertama dari list. -
return view('students.detail', compact(...));
Mengirim data ke viewstudents/detail.blade.phpdengan variabel$students,$popularMajor, dan$selectedStudent.
5. Untuk bagian detail.blade.php masukan kode beikut
Berikut adalah tampilannya