197 lines
6.4 KiB
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.');
|
|
}
|
|
}
|