LAPORAN PRAKTIKUM 10

Untuk praktikum ini, kita akan membuat sistem akademik sederhana dengan relationship:

  • Student belongs to Major (Many-to-One)
  • Student belongs to many Subject through pivot table (Many-to-Many)
  • Major has many Student (One-to-Many)
  • Subject belongs to many Student through pivot table (Many-to-Many)

Buat project baru dengan nama laravel-relationship, selanjutnya buat migrasi database.

A. Migration untuk tabel majors

Buat migrasi database dengan menggunakan command php artisan make:migration create_majors_table. Kemudian tambahkan kode berikut di function up()

Schema::create('majors', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->timestamps();
        });
B. Migration untuk tabel students

Buat migrasi database dengan menggunakan command php artisan make:migration create_students_table. Kemudian tambahkan kode berikut di function up()

Schema::create('students', function (Blueprint $table) {
            $table->id();
            $table->string('nim')->unique();
            $table->string('name');
            $table->text('address');
            $table->foreignId('major_id')->constrained('majors')->onDelete('cascade');
            $table->timestamps();
        });
C. Migration untuk tabel subjects

Buat migrasi database dengan menggunakan command php artisan make:migration create_subjects_table. Kemudian tambahkan kode berikut di function up()

Schema::create('subjects', function (Blueprint $table) {
            $table->id();
            $table->string('name');
            $table->integer('sks');
            $table->timestamps();
        });
D. Migration untuk tabel pivot student_subject

Buat migrasi database dengan menggunakan command php artisan make:migration create_student_subject_table. Kemuidian tambahkan kode berikut di 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']);
        });

Setelah semua migrasi telah dibuat dan disave, jalankan migrasi database dengan perintah php artisan migrate


Langkah selanjutnya adalah membuat model dengan relationship sesuai dengan migrasi database yang telah dibuat.

A. Model Major

Buat model major dengan perintah php artisan make:model Major pada terminal. Setelah itu, masukkan kode berikut di model:

<?php

namespace App\Models;

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

class Major extends Model
{
    use HasFactory;
    protected $fillable = ['name'];

    //Relationship: One Major has many Student
    public function students()
    {
        return $this->hasMany(Student::class);
    }
}
B. Model Student

Buat model student dengan perintah php artisan make:model Student pada terminal. Setelah itu, masukkan kode berikut di model:

<?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'];

    // Relationship: Many Students belong to one Major
    public function major()
    {
        return $this->belongsTo(Major::class);
    }
    
    // Relationship: Many Students belong to many Subjects
    public function subjects()
    {
        return $this->belongsToMany(Subject::class);
    }
}
C. Model Subject

Buat model subject dengan perintah php artisan make:model Subject pada terminal. Setelah itu, masukkan kode berikut di model:

<?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'];

    // Relationship: Many Subjects belong to many Students
    public function students()
    {
        return $this->belongsToMany(Student::class);
    }
}

Langkah selanjutnya adalah membuat seeder untuk memasukkan data ke database

A. Seeder untuk Major

Buat seeder dengan command php artisan make:seeder MajorSeeder, lalu isi seeder dengan kode berikut:

<?php

namespace Database\Seeders;

use App\Models\Major;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class MajorSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run()
    {
        $majors = [
            ['name' => 'Teknik Informatika'],
            ['name' => 'Sistem Informasi'],
            ['name' => 'Teknik Komputer'],
            ['name' => 'Manajemen Informatika'],
        ];

        foreach ($majors as $major) {
            Major::create($major);
        }
    }
}
B. Seeder untuk Subject

Buat seeder dengan command php artisan make:seeder SubjectSeeder, lalu isi seeder dengan kode berikut:

<?php

namespace Database\Seeders;

use App\Models\Subject;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class SubjectSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run()
    {
        $subjects = [
            ['name' => 'Pemrograman Web', 'sks' => 3],
            ['name' => 'Database', 'sks' => 3],
            ['name' => 'Algoritma', 'sks' => 2],
            ['name' => 'Jaringan Komputer', 'sks' => 3],
            ['name' => 'Sistem Operasi', 'sks' => 2],
        ];

        foreach ($subjects as $subject) {
            Subject::create($subject);
        }
    }
}
C. Seeder untuk Student

Buat seeder dengan command php artisan make:seeder StudentSeeder, lalu isi seeder dengan kode berikut:

<?php

namespace Database\Seeders;

use App\Models\Student;
use App\Models\Subject;
use Illuminate\Database\Console\Seeds\WithoutModelEvents;
use Illuminate\Database\Seeder;

class StudentSeeder extends Seeder
{
    /**
     * Run the database seeds.
     */
    public function run()
    {
        $students = [
            ['nim' => '20210001', 'name' => 'Ahmad Rizki', 'address' => 'Jl. Merdeka No. 1', 'major_id' => 1],
            ['nim' => '20210002', 'name' => 'Siti Nurhaliza', 'address' => 'Jl. Sudirman No. 15', 'major_id' => 1],
            ['nim' => '20210003', 'name' => 'Budi Santoso', 'address' => 'Jl. Pahlawan No. 8', 'major_id' => 2],
            ['nim' => '20210004', 'name' => 'Dewi Kartika', 'address' => 'Jl. Diponegoro No. 22', 'major_id' => 2],
            ['nim' => '20210005', 'name' => 'Eko Prasetyo', 'address' => 'Jl. Gatot Subroto No. 11', 'major_id' => 3],
        ];

        foreach ($students as $studentData) {
            $student = Student::create($studentData);

            // Assign random subjects to each student
            $subjects = Subject::inRandomOrder()->take(rand(2, 4))->pluck('id');
            $student->subjects()->attach($subjects);
        }
    }
}
D. Update DatabaseSeeder

Tambahkan kode berikut pada DatabaseSeeder

<?php

namespace Database\Seeders;

use Illuminate\Database\Seeder;

class DatabaseSeeder extends Seeder
{

    public function run()
    {
        $this->call([
            MajorSeeder::class,
            SubjectSeeder::class,
            StudentSeeder::class,
        ]);
    }
}

setelah semua seeder dibuat dan di save, jalankan dengan perintah php artisan db:seed


Langkah selanjutnya adlaah membuat controller pada model. Buat controller dengan perintah php artisan make:controller StudentController pada terminal. Kemudian tambahkan kode berikut di file controller:

<?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()
    {
        // Eager loading untuk menghindari N+1 problem
        $students = Student::with(['major', 'subjects'])->get();
        return view('students.index', compact('students', 'mostFrequentMajor'));
    }

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

    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 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(); // Remove all subject relationships
        $student->delete();
        
        return redirect()->route('students.index')->with('success', 'Student deleted successfully');
    }
}

Langkah selanjutnya yaitu membuat Route untuk menentukan bagaimana aplikasi merespons permintaan (request) pada URL tertentu. Ubah kode pada web.php menjadi kode berikut:

<?php

use App\Http\Controllers\StudentController;
use Illuminate\Support\Facades\Route;

Route::get('/', function () {
    return redirect()->route('students.index');
});

Route::resource('students', StudentController::class);

Leave a Reply

Your email address will not be published. Required fields are marked *