MIF_E31222307/app/Http/Controllers/AlternatifController.php

197 lines
6.4 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Kriteria;
use App\Models\Makanan; // alternatif
use App\Models\PerbandinganAlternatif;
use App\Models\SkorMakanan;
use Illuminate\Support\Facades\DB;
class AlternatifController extends Controller
{
//
// 1. Tampilkan form pemilihan alternatif
public function formPilihAlternatif(Request $request)
{
$sort = $request->query('sort');
if (in_array($sort, ['lemak', 'natrium', 'energi', 'karbohidrat'])) {
$makanans = Makanan::orderBy($sort, 'desc')->get(); // urut dari tinggi ke rendah
} else {
$makanans = Makanan::all();
}
return view('admin.alternatif.pilih', compact('makanans'));
}
// 2. Simpan pilihan alternatif ke session
public function pilihAlternatif(Request $request)
{
$request->validate([
'alternatifs' => 'required|array|min:2',
]);
session(['alternatifs_dipilih' => $request->alternatifs]);
return redirect()->route('alternatif.perbandingan');
}
// 3. Tampilkan form perbandingan alternatif per kriteria
public function tampilPerbandingan()
{
$idAlternatif = session('alternatifs_dipilih');
if (!$idAlternatif || count($idAlternatif) < 2) {
return redirect()->route('alternatif.pilih')->with('error', 'Pilih minimal dua alternatif terlebih dahulu.');
}
$alternatifs = Makanan::whereIn('id', $idAlternatif)->get();
$kriterias = Kriteria::all();
return view('admin.alternatif.perbandingan', compact('kriterias', 'alternatifs'));
}
// 4. Simpan hasil perbandingan ke database
public function simpanPerbandingan(Request $request)
{
$data = $request->input('nilai');
foreach ($data as $kriteria_id => $baris) {
foreach ($baris as $alt1 => $kolom) {
foreach ($kolom as $alt2 => $nilai) {
if ($alt1 != $alt2 && $nilai != null) {
// Simpan nilai asli
PerbandinganAlternatif::updateOrCreate(
[
'kriteria_id' => $kriteria_id,
'alternatif_id_1' => $alt1,
'alternatif_id_2' => $alt2,
],
['nilai' => $nilai]
);
// Simpan nilai kebalikannya
PerbandinganAlternatif::updateOrCreate(
[
'kriteria_id' => $kriteria_id,
'alternatif_id_1' => $alt2,
'alternatif_id_2' => $alt1,
],
['nilai' => 1 / $nilai]
);
}
}
}
}
if ($request->input('action') == 'lanjut') {
return redirect()->route('alternatif.normalisasi')->with('success', 'Data berhasil disimpan, lanjut ke tahap normalisasi.');
}
return redirect()->back()->with('success', 'Perbandingan alternatif berhasil disimpan.');
}
public function tampilNormalisasi()
{
$idAlternatif = session('alternatifs_dipilih');
if (!$idAlternatif || count($idAlternatif) < 2) {
return redirect()->route('alternatif.pilih')->with('error', 'Pilih minimal dua alternatif terlebih dahulu.');
}
$alternatifs = Makanan::whereIn('id', $idAlternatif)->get();
$kriterias = Kriteria::all();
$matriks = [];
foreach ($kriterias as $kriteria) {
$matriks[$kriteria->id] = [];
foreach ($alternatifs as $alt1) {
$matriks[$kriteria->id][$alt1->id] = [];
foreach ($alternatifs as $alt2) {
if ($alt1->id == $alt2->id) {
$matriks[$kriteria->id][$alt1->id][$alt2->id] = 1;
} else {
$nilai = DB::table('perbandingan_alternatifs')
->where('kriteria_id', $kriteria->id)
->where('alternatif_id_1', $alt1->id)
->where('alternatif_id_2', $alt2->id)
->value('nilai');
$matriks[$kriteria->id][$alt1->id][$alt2->id] = $nilai ?? 1; // default 1
}
}
}
}
return view('admin.alternatif.normalisasi', compact('alternatifs', 'kriterias', 'matriks'));
}
public function simpanNormalisasi()
{
$idAlternatif = session('alternatifs_dipilih');
if (!$idAlternatif || count($idAlternatif) < 2) {
return redirect()->route('alternatif.pilih')->with('error', 'Pilih minimal dua alternatif terlebih dahulu.');
}
$alternatifs = Makanan::whereIn('id', $idAlternatif)->get();
$kriterias = Kriteria::all();
foreach ($kriterias as $kriteria) {
$jumlahKolom = [];
foreach ($alternatifs as $colAlt) {
$jumlahKolom[$colAlt->id] = 0;
}
// Hitung jumlah kolom
foreach ($alternatifs as $rowAlt) {
foreach ($alternatifs as $colAlt) {
$nilai = DB::table('perbandingan_alternatifs')
->where('kriteria_id', $kriteria->id)
->where('alternatif_id_1', $rowAlt->id)
->where('alternatif_id_2', $colAlt->id)
->value('nilai') ?? 1;
$jumlahKolom[$colAlt->id] += $nilai;
}
}
// Hitung bobot (normalisasi + rata-rata baris)
foreach ($alternatifs as $rowAlt) {
$jumlahBaris = 0;
foreach ($alternatifs as $colAlt) {
$nilai = DB::table('perbandingan_alternatifs')
->where('kriteria_id', $kriteria->id)
->where('alternatif_id_1', $rowAlt->id)
->where('alternatif_id_2', $colAlt->id)
->value('nilai') ?? 1;
$normalized = $nilai / $jumlahKolom[$colAlt->id];
$jumlahBaris += $normalized;
}
$bobot = $jumlahBaris / count($alternatifs);
// Simpan ke skor_makanan
SkorMakanan::updateOrCreate(
[
'kriteria_id' => $kriteria->id,
'makanan_id' => $rowAlt->id
],
[
'nilai' => $bobot
]
);
}
}
return redirect()->route('rekomendasi.proses')->with('success', 'Bobot alternatif berhasil disimpan ke skor_makanan.');
}
}