Laravel Query Scope untuk Filter
PHP
#laravel
#eloquent
#filter
#scope
Pattern reusable query scope untuk filter data berdasarkan request parameter.
<?php
// Di Model
class Product extends Model
{
public function scopeFilter(Builder $query, array $filters): Builder
{
return $query
->when($filters['search'] ?? null, function ($q, $search) {
$q->where(function ($q) use ($search) {
$q->where('name', 'like', "%{$search}%")
->orWhere('description', 'like', "%{$search}%");
});
})
->when($filters['category'] ?? null, fn ($q, $cat) => $q->where('category_id', $cat))
->when($filters['min_price'] ?? null, fn ($q, $min) => $q->where('price', '>=', $min))
->when($filters['max_price'] ?? null, fn ($q, $max) => $q->where('price', '<=', $max))
->when($filters['sort'] ?? null, function ($q, $sort) {
match ($sort) {
'price_asc' => $q->orderBy('price'),
'price_desc' => $q->orderByDesc('price'),
'newest' => $q->latest(),
default => $q->orderBy('name'),
};
});
}
}
// Di Controller
$products = Product::filter($request->only(['search', 'category', 'min_price', 'max_price', 'sort']))
->paginate(15);
236 views
18 copies
12 jam yang lalu