Fitur filter dan pencarian data adalah kebutuhan yang sangat umum dalam aplikasi web — dari filter produk di e-commerce hingga pencarian laporan di sistem manajemen. Di Laravel, ada beberapa cara untuk mengimplementasikannya, mulai dari yang paling sederhana hingga yang paling terstruktur. Artikel ini akan mengajarkan kamu pola filter data yang bersih, mudah diperluas, dan tidak mengotori controller.
Pendekatan Sederhana: Filter Langsung di Controller
Cara paling dasar adalah menggunakan kondisional di query builder. Cocok untuk filter yang tidak terlalu banyak:
<?php
namespace App\Http\Controllers;
use App\Models\Product;
use Illuminate\Http\Request;
class ProductController extends Controller
{
public function index(Request $request)
{
$query = Product::query();
// Filter berdasarkan nama (pencarian)
if ($request->filled('search')) {
$query->where('name', 'like', '%' . $request->search . '%');
}
// Filter berdasarkan kategori
if ($request->filled('category_id')) {
$query->where('category_id', $request->category_id);
}
// Filter range harga
if ($request->filled('min_price')) {
$query->where('price', '>=', $request->min_price);
}
if ($request->filled('max_price')) {
$query->where('price', '<=', $request->max_price);
}
// Sorting
$sortBy = $request->get('sort_by', 'created_at');
$sortDir = $request->get('sort_dir', 'desc');
$allowedSorts = ['name', 'price', 'created_at'];
if (in_array($sortBy, $allowedSorts)) {
$query->orderBy($sortBy, $sortDir === 'asc' ? 'asc' : 'desc');
}
$products = $query->paginate(15)->withQueryString();
return view('products.index', compact('products'));
}
}
Membuat Form Filter di Blade
<form method="GET" action="{{ route('products.index') }}">
<input type="text" name="search" value="{{ request('search') }}" placeholder="Cari produk...">
<select name="category_id">
<option value="">Semua Kategori</option>
@foreach($categories as $cat)
<option value="{{ $cat->id }}" {{ request('category_id') == $cat->id ? 'selected' : '' }}>
{{ $cat->name }}
</option>
@endforeach
</select>
<input type="number" name="min_price" value="{{ request('min_price') }}" placeholder="Harga min">
<input type="number" name="max_price" value="{{ request('max_price') }}" placeholder="Harga maks">
<button type="submit">Filter</button>
<a href="{{ route('products.index') }}">Reset</a>
</form>
Gunakan withQueryString() pada paginator agar parameter filter tetap ada saat berpindah halaman.
Artikel ini ditampilkan sebagian. Untuk pembahasan selengkapnya, beserta contoh dan langkah detailnya, Anda dapat membacanya pada sumber aslinya:
Cara Membuat Fitur Filter Data di Laravel
Tutorial pemrograman dan tools developer lainnya juga tersedia di dhiecoderweb.com.
Top comments (0)