Tutorial

Input Nilai Alternatif SAW Laravel

Membuat matriks penilaian alternatif terhadap setiap kriteria pada aplikasi SAW Laravel menggunakan form, validasi, dan database.

Daftar Isi

Pada bagian ini buat form untuk mengisi nilai setiap alternatif pada setiap kriteria.

Buat Controller

php artisan make:controller PenilaianController

PenilaianController

app/Http/Controllers/PenilaianController.php:

<?php

namespace App\Http\Controllers;

use App\Models\Alternatif;
use App\Models\Kriteria;
use App\Models\Penilaian;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;

class PenilaianController extends Controller
{
    public function index()
    {
        $kriteria = Kriteria::orderBy('kode')->get();
        $alternatif = Alternatif::orderBy('kode')->get();

        $records = Penilaian::all()
            ->keyBy(function ($item) {
                return $item->alternatif_id
                    . '-'
                    . $item->kriteria_id;
            });

        return view('penilaian.index', compact(
            'kriteria',
            'alternatif',
            'records'
        ));
    }

    public function store(Request $request)
    {
        $kriteria = Kriteria::orderBy('kode')->get();
        $alternatif = Alternatif::orderBy('kode')->get();

        if ($kriteria->isEmpty() || $alternatif->isEmpty()) {
            return back()->withErrors(
                'Kriteria dan alternatif harus tersedia.'
            );
        }

        $request->validate([
            'nilai' => ['required', 'array'],
            'nilai.*' => ['required', 'array'],
            'nilai.*.*' => [
                'required',
                'numeric',
                'gte:0',
            ],
        ]);

        DB::transaction(function () use (
            $request,
            $kriteria,
            $alternatif
        ) {
            foreach ($alternatif as $itemAlternatif) {
                foreach ($kriteria as $itemKriteria) {
                    $nilai = $request->input(
                        "nilai.{$itemAlternatif->id}.{$itemKriteria->id}"
                    );

                    Penilaian::updateOrCreate(
                        [
                            'alternatif_id' => $itemAlternatif->id,
                            'kriteria_id' => $itemKriteria->id,
                        ],
                        [
                            'nilai' => (float) $nilai,
                        ]
                    );
                }
            }

            Alternatif::query()->update([
                'nilai_preferensi' => null,
                'ranking' => null,
            ]);
        });

        return redirect()
            ->route('penilaian.index')
            ->with(
                'success',
                'Nilai alternatif berhasil disimpan.'
            );
    }
}

Route

Tambahkan pada grup auth:

use App\Http\Controllers\PenilaianController;

Route::get(
    '/penilaian',
    [PenilaianController::class, 'index']
)->name('penilaian.index');

Route::post(
    '/penilaian',
    [PenilaianController::class, 'store']
)->name('penilaian.store');

Tambahkan Menu

<a
    class="nav-link text-white"
    href="{{ route('penilaian.index') }}">
    Penilaian
</a>

View Penilaian

resources/views/penilaian/index.blade.php:

@extends('layouts.app')

@section('title', 'Penilaian')

@section('content')
<div class="d-flex justify-content-between align-items-center mb-3">
    <div>
        <h2 class="h4 mb-1">Penilaian Alternatif</h2>

        <p class="text-muted mb-0">
            Masukkan nilai setiap alternatif pada setiap kriteria.
        </p>
    </div>
</div>

@if($kriteria->isEmpty())
    <div class="alert alert-warning">
        Belum ada kriteria.
    </div>
@elseif($alternatif->isEmpty())
    <div class="alert alert-warning">
        Belum ada alternatif.
    </div>
@else
    <form
        method="POST"
        action="{{ route('penilaian.store') }}">

        @csrf

        <div class="card border-0 shadow-sm">
            <div class="card-body">
                <div class="table-responsive">
                    <table
                        class="table table-bordered align-middle text-center">

                        <thead>
                        <tr>
                            <th class="text-start">Alternatif</th>

                            @foreach($kriteria as $itemKriteria)
                                <th>
                                    {{ $itemKriteria->kode }}

                                    <div class="small fw-normal">
                                        {{ $itemKriteria->nama }}
                                    </div>

                                    <div class="small fw-normal text-muted">
                                        {{ ucfirst($itemKriteria->atribut) }}
                                        |
                                        Bobot: {{ $itemKriteria->bobot }}
                                    </div>
                                </th>
                            @endforeach
                        </tr>
                        </thead>

                        <tbody>
                        @foreach($alternatif as $itemAlternatif)
                            <tr>
                                <th class="text-start">
                                    {{ $itemAlternatif->kode }}
                                    -
                                    {{ $itemAlternatif->nama }}
                                </th>

                                @foreach($kriteria as $itemKriteria)
                                    @php
                                        $key =
                                            $itemAlternatif->id
                                            . '-'
                                            . $itemKriteria->id;

                                        $record =
                                            $records->get($key);

                                        $nilaiLama = old(
                                            "nilai.{$itemAlternatif->id}.{$itemKriteria->id}",
                                            $record?->nilai
                                        );
                                    @endphp

                                    <td style="min-width:150px">
                                        <input
                                            type="number"
                                            name="nilai[{{ $itemAlternatif->id }}][{{ $itemKriteria->id }}]"
                                            value="{{ $nilaiLama }}"
                                            class="form-control text-end"
                                            step="0.000001"
                                            min="0"
                                            required>
                                    </td>
                                @endforeach
                            </tr>
                        @endforeach
                        </tbody>
                    </table>
                </div>

                <button class="btn btn-primary">
                    Simpan Penilaian
                </button>
            </div>
        </div>
    </form>
@endif
@endsection

Contoh Data Tutorial

Masukkan:

A1:
C1 = 80
C2 = 8
C3 = 9

A2:
C1 = 70
C2 = 9
C3 = 8

A3:
C1 = 75
C2 = 7
C3 = 9
Tutorial Saw Laravel Penilaian

Checkpoint

Pastikan:

  • semua alternatif tampil;
  • semua kriteria tampil;
  • nilai dapat disimpan;
  • nilai lama tampil kembali;
  • semua sel wajib diisi.
Lanjut: Perhitungan SAW dengan Laravel

Tulis Komentar

Alamat email Anda tidak akan dipublikasikan. Ruas yang wajib ditandai *