Bagian 3 dari seri

Input Nilai Alternatif SAW Laravel

Diterbitkan 21 September 2026

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