Implementasi Relationship dalam Laravel

Card image

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:

Card image

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:

Card image

Penjelasan kode:

  • $table->id(): Membuat kolom ID sebagai primary key bertipe big integer dan auto increment.
  • $table->string('name'): Kolom name digunakan untuk menyimpan nama jurusan.
  • $table->timestamps(): Menambahkan kolom created_at dan updated_at secara otomatis.

Setelah itu, jalankan perintah berikut untuk mengeksekusi migration:

Card image

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:

Card image

Setelah itu, buka file migration yang telah dibuat di folder database/migrations dan ubah isinya menjadi seperti berikut:

Card image

Penjelasan struktur tabel:

  • $table->id(): Membuat kolom primary key otomatis bernama id.
  • $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 tabel majors, yang akan otomatis menghapus data mahasiswa jika jurusan terkait dihapus (onDelete('cascade')).
  • $table->timestamps(): Menambahkan kolom created_at dan updated_at.

Setelah selesai membuat migration, jalankan perintah berikut untuk mengeksekusi migration dan membuat tabel students di database:

Card image

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:

Card image

Setelah perintah dijalankan, buka file migration yang terletak di direktori database/migrations, lalu ubah isinya menjadi seperti berikut:

Card image

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 waktu created_at dan updated_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:

Card image

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:

Card image
Penjelasan Kode:
  • $table->id(): Kolom primary key untuk tabel pivot (opsional, tapi berguna untuk identifikasi data jika dibutuhkan).
  • student_id: Merujuk ke kolom id dari tabel students. Menggunakan constrained('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 kolom id dari tabel subjects dengan 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:

Card image

Perintah ini akan menghasilkan file Major.php di dalam folder app/Models.

Buka file app/Models/Major.php dan ubah isinya menjadi seperti berikut:

Card image
Penjelasan Kode:
  • use HasFactory;: Digunakan untuk mendukung fitur Factory pada Laravel jika diperlukan.
  • protected $fillable = ['name'];: Menentukan bahwa field name bisa diisi melalui proses mass assignment (misalnya melalui form atau create()).
  • students(): Mendefinisikan relasi hasMany, artinya satu jurusan bisa memiliki banyak mahasiswa. Relasi ini menghubungkan model Major dengan model Student.
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:

Card image

Perintah ini akan menghasilkan file Student.php di dalam folder app/Models.

Buka file app/Models/Student.php dan ubah isinya menjadi seperti berikut:

Card image
Penjelasan Kode:
  • protected $fillable: Mengizinkan atribut nim, name, address, dan major_id untuk diisi melalui form atau metode mass assignment lainnya.
  • major(): Mendefinisikan relasi belongsTo, yaitu satu mahasiswa hanya berasal dari satu jurusan (relasi Many to One).
  • subjects(): Mendefinisikan relasi belongsToMany, artinya satu mahasiswa bisa mengambil banyak mata kuliah. Laravel secara otomatis akan menggunakan tabel pivot student_subject untuk 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:

Card image

Perintah ini akan menghasilkan file baru bernama Subject.php di dalam folder app/Models.

Edit file app/Models/Subject.php menjadi seperti berikut:

Card image
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 model Student. Laravel secara otomatis menggunakan tabel pivot student_subject berdasarkan 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:

Card image

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:

Card image
Penjelasan:
  • Kita mendefinisikan array $majors yang berisi data jurusan.
  • Dengan menggunakan perulangan foreach, setiap jurusan akan dimasukkan ke database melalui model Major.

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).

Card image

File akan berada di: database/seeders/SubjectSeeder.php.

Card image
Penjelasan:
  • Variabel $subjects berisi array data mata kuliah awal.
  • Setiap elemen array memiliki atribut name dan sks.
  • Mata kuliah dimasukkan ke dalam tabel subjects menggunakan method Subject::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.

Card image

File akan berada di: database/seeders/StudentSeeder.php

Card image
Penjelasan:
  • Array $students menyimpan data mahasiswa awal, termasuk nim, name, address, dan major_id.
  • Setiap mahasiswa dibuat menggunakan method Student::create().
  • Setelah dibuat, mahasiswa diberi beberapa mata kuliah secara acak melalui relasi many-to-many subjects() dan method attach().

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

Card image
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 students dan relasi ke subjects

Menjalankan Semua Seeder

Card image

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 tabel student_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

Card image

Perintah ini akan menghasilkan file StudentController.php di direktori app/Http/Controllers/.

Isi Lengkap StudentController

Card image
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

Card image
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 /studentsindex()
    • GET /students/createcreate()
    • POST /studentsstore()
    • GET /students/{id}show()
    • GET /students/{id}/editedit()
    • 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

Card image
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

Card image

Isi File

Card image
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

Card image
Penjelasan:
  • CSRF Protection: Gunakan @csrf untuk keamanan form.
  • Input Validasi: Menggunakan @error untuk 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

Card image

Untuk tampilan bagian Tambah mahasiswa adalah sebagai berikut

Card image

Ketika berhasil ditambahka akan muncul alert seperti berikut

Card image

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

Card image

2. Untuk bagian edit.blade.php masukan kode beikut

Card image

Tampilannya akan seperti berikut

Card image

3. Untuk menampilkan Jurusan yang memiliki mahasiswa terbanyak disini saya menembahkan satu tombol lagi pada bagian index.blade.php

Card image

4. Lalu pada bagian StudentControllr.php tambahkan kode berikut

Card image
Penjelasan:
  • $students = Student::with(['major', 'subjects'])->get();
    Mengambil semua data mahasiswa beserta relasi ke tabel majors dan subjects.
  • $popularMajor = Major::withCount('students')->orderByDesc('students_count')->first();
    Mengambil jurusan yang memiliki jumlah mahasiswa terbanyak menggunakan withCount().
  • $selectedStudentId = $request->input('student_id');
    Mengambil nilai student_id yang 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 view students/detail.blade.php dengan variabel $students, $popularMajor, dan $selectedStudent.

5. Untuk bagian detail.blade.php masukan kode beikut

Card image

Berikut adalah tampilannya

Card image

Membuat CRUD (Create, Read, Update dan Delete) Sederhana OOP (Object Oriented Programming) Menggunakan PHP & MYSQL

Card image Read More

Konvigurasi Laravel

Card image Read More

Laravel AUTH, CRUD Multi Level User

Card image Read More

Lanjutan Laravel AUTH, CRUD Multi Level User

Card image Read More