Recaje-New/app/Http/Controllers/CafeController.php

91 lines
3.0 KiB
PHP

<?php
namespace App\Http\Controllers;
use Illuminate\Http\Request;
use App\Models\Cafe;
use App\Models\Category;
use App\Models\Subcategory;
use Illuminate\Support\Facades\DB;
class CafeController extends Controller
{
/**
* Tampilkan halaman pencarian cafe dengan stepper
*/
public function search(Request $request)
{
// Tentukan langkah saat ini berdasarkan parameter URL
$currentStep = 1;
if ($request->has('weight')) {
$currentStep = 3; // Hasil
} elseif ($request->has('criteria')) {
$currentStep = 2; // Kriteria
}
return view('cafe.search-fixed', compact('currentStep'));
}
/**
* Tampilkan halaman rekomendasi cafe
*/
public function recommend()
{
return view('cafe.recommend');
}
/**
* Tampilkan semua cafe dengan fitur fuzzy search toleran terhadap typo
*/
public function index(Request $request)
{
$query = Cafe::with(['ratings.subcategory', 'ratings.category']);
// Filter berdasarkan pencarian jika ada
if ($request->has('search') && !empty($request->search)) {
$searchTerm = $request->search;
// Memecah kata kunci pencarian menjadi beberapa kata
$keywords = explode(' ', $searchTerm);
$query->where(function($q) use ($searchTerm, $keywords) {
// Exact match dengan prioritas tertinggi
$q->where('nama', 'LIKE', "%{$searchTerm}%");
// Pencarian fuzzy untuk masing-masing kata kunci
foreach ($keywords as $keyword) {
if (strlen($keyword) >= 3) {
// Membuat variasi kata kunci untuk toleransi typo
$q->orWhere('nama', 'LIKE', "%{$keyword}%");
// Tambahkan wildcard di tengah untuk toleransi kesalahan ketik 1 karakter
for ($i = 0; $i < strlen($keyword) - 1; $i++) {
$fuzzyWord = substr($keyword, 0, $i) . '_' . substr($keyword, $i + 1);
$q->orWhere('nama', 'LIKE', "%{$fuzzyWord}%");
}
}
}
// Mencoba juga pencarian dengan operator SOUNDS LIKE jika tersedia
try {
$q->orWhereRaw("SOUNDEX(nama) = SOUNDEX(?)", [$searchTerm]);
} catch (\Exception $e) {
// SOUNDEX mungkin tidak tersedia, tidak perlu error handling
}
});
}
$cafes = $query->latest()->paginate(12)->withQueryString();
return view('cafe.index', compact('cafes'));
}
/**
* Tampilkan detail cafe
*/
public function show($id)
{
$cafe = Cafe::with(['ratings.subcategory', 'ratings.category'])->findOrFail($id);
return view('cafe.show', compact('cafe'));
}
}