Oalah, siap! Berarti ini untuk **Praktikum 9**, bukan Praktikum 8. Saya sesuaikan semua teks judul, heading, nama dokumen, dan informasi di dalam laporan agar konsisten menjadi **Praktikum 9 - Laravel Relationship CRUD**. Format penamaan dan urutan ke-14 foto tetap dipertahankan menggunakan nama `9.1 (1).png` sampai `9.1 (14).png`. Berikut adalah kode HTML utuh yang sudah diperbarui: ```html Praktikum 9 Laravel Relationship CRUD

Praktikum 9 - Laravel Relationship CRUD

Migration, Seeding, Routing, Model, Controller, dan View Berbasis Relasi Database

Laravel

Pendahuluan

Laravel merupakan framework PHP yang digunakan untuk membangun aplikasi web modern dengan konsep MVC (Model View Controller). Laravel menyediakan berbagai fitur yang mempermudah developer dalam proses pengembangan aplikasi web seperti migration, seeding, routing, model, controller, dan blade template.

Pada praktikum 9 ini dilakukan pembuatan aplikasi CRUD Mahasiswa menggunakan Laravel mulai dari konfigurasi database hingga menampilkan data relasional antartabel menggunakan view blade.

Tujuan Praktikum

  • Memahami konsep migration Laravel dan Foreign Key constraints.
  • Memahami penggunaan seeding database untuk mengisi data sampel otomatis.
  • Memahami routing resource Laravel.
  • Membuat model dan mendefinisikan Eloquent Relationship (One-to-Many & Many-to-Many).
  • Membuat controller untuk menangani logika sinkronisasi tabel pivot dengan method attach() dan sync().
  • Membuat view dinamis terintegrasi menggunakan blade template dan Bootstrap 5.

Langkah-Langkah Praktikum

Tahap 1: Membuat Migration (Struktur Database)

Migration digunakan untuk membuat tabel-tabel di database lewat kode PHP. Kita akan membuat 4 tabel: majors, students, subjects, dan tabel pivot student_subject.

Step 1.1: Migration Tabel majors

Buka terminal di folder project Laravel Anda, lalu ketik perintah berikut:

php artisan make:migration create_majors_table

Buka file migration tersebut di text editor Anda, lalu ubah fungsinya menjadi seperti ini:

public function up(){
    Schema::create('majors', function (Blueprint $table) {
        $table->id(); // Primary Key
        $table->string('name');
        $table->timestamps(); // create_at & updated_at
    });
}
Step 1.2: Migration Tabel students

Jalankan perintah di terminal:

php artisan make:migration create_students_table

Buka file migration-nya dan isi dengan kode berikut:

public function up(){
    Schema::create('students', function (Blueprint $table) {
        $table->id();
        $table->string('nim')->unique(); // Unique Key
        $table->string('name');
        $table->text('address');
        // Foreign Key ke tabel majors.id, jika major dihapus, student ikut terhapus
        $table->foreignId('major_id')->constrained('majors')->onDelete('cascade');
        $table->timestamps();
    });
}
Step 1.3: Migration Tabel subjects

Jalankan perintah di terminal:

php artisan make:migration create_subjects_table

Buka file migration-nya dan isi dengan kode berikut:

public function up(){
    Schema::create('subjects', function (Blueprint $table) {
        $table->id();
        $table->string('name');
        $table->integer('sks');
        $table->timestamps();
    });
}
Step 1.4: Migration Tabel Pivot student_subject

Tabel ini digunakan untuk menghubungkan relasi Many-to-Many antara Student dan Subject. Jalankan perintah di terminal:

php artisan make:migration create_student_subject_table

Buka file migration-nya dan pastikan kodenya ditulis di dalam Schema::create dengan benar:

public function up(){
    Schema::create('student_subject', function (Blueprint $table) {
        $table->id();
        $table->foreignId('student_id')->constrained('students')->onDelete('cascade');
        $table->foreignId('subject_id')->constrained('subjects')->onDelete('cascade');
        $table->timestamps();

        // Mencegah duplikasi kombinasi student_id dan subject_id
        $table->unique(['student_id', 'subject_id']);
    });
}
Step 1.5: Eksekusi Migration

Sekarang kita kirim struktur di atas ke dalam database asli. Jalankan:

php artisan migrate

Tahap 2: Membuat Model & Eloquent Relationship

Model adalah representasi tabel database di dalam kode PHP kita. Di sini kita akan mendefinisikan hubungan antar tabel tersebut.

Step 2.1: Model Major

Jalankan perintah di terminal:

php artisan make:model Major

Buka app/Models/Major.php dan sesuaikan kodenya:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Major extends Model{
    use HasFactory;

    protected $fillable = ['name'];

    // Relasi: Satu Jurusan punya banyak Mahasiswa (One-to-Many)
    public function students()
    {
        return $this->hasMany(Student::class);
    }
}
Step 2.2: Model Student

Jalankan perintah di terminal:

php artisan make:model Student

Buka app/Models/Student.php dan ubah kodenya:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Student extends Model{
    use HasFactory;

    protected $fillable = ['nim', 'name', 'address', 'major_id'];

    // Relasi: Banyak Mahasiswa dimiliki oleh satu Jurusan (Many-to-One / BelongsTo)
    public function major()
    {
        return $this->belongsTo(Major::class);
    }

    // Relasi: Banyak Mahasiswa mengambil banyak Mata Kuliah (Many-to-Many)
    public function subjects()
    {
        return $this->belongsToMany(Subject::class);
    }
}
Step 2.3: Model Subject

Jalankan perintah di terminal:

php artisan make:model Subject

Buka app/Models/Subject.php dan ganti kodenya:

<?php

namespace App\Models;

use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;

class Subject extends Model{
    use HasFactory;

    protected $fillable = ['name', 'sks'];

    // Relasi: Banyak Mata Kuliah diambil oleh banyak Mahasiswa (Many-to-Many)
    public function students()
    {
        return $this->belongsToMany(Student::class);
    }
}

Tahap 3: Membuat Seeder (Data Sample Otomatis)

Seeder dipakai untuk mengisi database dengan data dummy agar kita bisa menguji aplikasinya dengan cepat.

Step 3.1: MajorSeeder, SubjectSeeder, dan StudentSeeder

Jalankan pembuatan seeder di terminal secara bergantian, lalu isi kodenya sesuai panduan relasi akademik.

php artisan make:seeder MajorSeeder
php artisan make:seeder SubjectSeeder
php artisan make:seeder StudentSeeder
Step 3.4: Daftarkan dan Jalankan Seeder

Buka file induk seeder di database/seeders/DatabaseSeeder.php, panggil seeder yang sudah dibuat, lalu eksekusi pengisian data lewat terminal:

php artisan db:seed

Tahap 4: Membuat Controller (Logika Bisnis)

Controller akan menjembatani antara data dari model untuk dilempar ke halaman web (View). Jalankan perintah di terminal:

php artisan make:controller StudentController

Buka app/Http/Controllers/StudentController.php dan lengkapi logika CRUD beserta fungsi sinkronisasi relasinya:

<?php

namespace App\Http\Controllers;

use App\Models\Student;
use App\Models\Major;
use App\Models\Subject;
use Illuminate\Http\Request;

class StudentController extends Controller{
    public function index()
    {
        $students = Student::with(['major', 'subjects'])->get();
        return view('students.index', compact('students'));
    }

    public function create()
    {
        $majors = Major::all();
        $subjects = Subject::all();
        return view('students.create', compact('majors', 'subjects'));
    }

    public function store(Request $request)
    {
        $request->validate([
            'nim' => 'required|unique:students',
            'name' => 'required',
            'address' => 'required',
            'major_id' => 'required|exists:majors,id',
            'subjects' => 'required|array',
            'subjects.*' => 'exists:subjects,id',
        ]);

        $student = Student::create($request->only(['nim', 'name', 'address', 'major_id']));
        $student->subjects()->attach($request->subjects);

        return redirect()->route('students.index')->with('success', 'Student created successfully');
    }

    public function show($id)
    {
        $student = Student::with(['major', 'subjects'])->findOrFail($id);
        return view('students.show', compact('student'));
    }

    public function edit($id)
    {
        $student = Student::with('subjects')->findOrFail($id);
        $majors = Major::all();
        $subjects = Subject::all();
        return view('students.edit', compact('student', 'majors', 'subjects'));
    }

    public function update(Request $request, $id)
    {
        $student = Student::findOrFail($id);

        $request->validate([
            'nim' => 'required|unique:students,nim,' . $student->id,
            'name' => 'required',
            'address' => 'required',
            'major_id' => 'required|exists:majors,id',
            'subjects' => 'required|array',
            'subjects.*' => 'exists:subjects,id',
        ]);

        $student->update($request->only(['nim', 'name', 'address', 'major_id']));
        $student->subjects()->sync($request->subjects);

        return redirect()->route('students.index')->with('success', 'Student updated successfully');
    }

    public function destroy($id)
    {
        $student = Student::findOrFail($id);
        $student->subjects()->detach();
        $student->delete();

        return redirect()->route('students.index')->with('success', 'Student deleted successfully');
    }
}

Tahap 5 & 6: Menghubungkan Route dan Membuat Front-End Views

Mendaftarkan resource route di file routes/web.php dan membangun sistem antarmuka berbasis blade template menggunakan framework Bootstrap 5.

Step 6.1: Layout Utama (resources/views/layouts/app.blade.php)
Step 6.2: Halaman Daftar (resources/views/students/index.blade.php)
Step 6.3: Halaman Tambah (resources/views/students/create.blade.php)

Hasil Praktikum

Berdasarkan praktikum 9 yang telah dilakukan, aplikasi Laravel berhasil dijalankan dengan baik. Migration berhasil membuat tabel database beserta konstrain relasi kunci tamu (foreign key), seeding berhasil menambahkan data awal, routing berhasil menghubungkan URL, serta model, controller, dan view berhasil digunakan untuk mengolah data hubungan antartabel mahasiswa secara dinamis.

Kesimpulan

Berdasarkan praktikum yang telah dilakukan dapat disimpulkan bahwa Laravel mempermudah proses pengembangan aplikasi web menggunakan konsep MVC. Fitur migration, seeding, routing, model, controller, dan blade template membantu developer dalam membuat aplikasi CRUD data relasional (One-to-Many dan Many-to-Many) secara lebih terstruktur, rapi, aman, dan efisien.

Link Github Project

Source code project Laravel CRUD dapat diakses melalui link Github berikut:

Github Project Kembali
```