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.'); } }