Sorting & Filtering di API Platform
API Platform menyediakan fitur filtering dan sorting secara otomatis menggunakan ekstensi bawaan seperti SearchFilter, RangeFilter, dan OrderFilter.
1. Install Dependency (Jika Belum)
composer require api-platform/doctrine-orm-filters
2. Aktifkan Filter di Resource
Gunakan attribute filters di ApiResource.
use ApiPlatform\Metadata\ApiFilter;
use ApiPlatform\Doctrine\Orm\Filter\SearchFilter;
use ApiPlatform\Doctrine\Orm\Filter\RangeFilter;
use ApiPlatform\Doctrine\Orm\Filter\OrderFilter;
#[ApiFilter(SearchFilter::class, properties: ['name' => 'partial', 'category' => 'exact'])]
#[ApiFilter(RangeFilter::class, properties: ['price'])]
#[ApiFilter(OrderFilter::class, properties: ['createdAt', 'price'], arguments: ['orderParameterName' => 'order'])]
class Product
{
// ...
}
3. Jenis Filter
🔎 SearchFilter
#[ApiFilter(SearchFilter::class, properties: ['name' => 'partial', 'status' => 'exact'])]
Contoh Request:
GET /api/products?name=book&status=active
📉 RangeFilter
#[ApiFilter(RangeFilter::class, properties: ['price'])]
Contoh Request:
GET /api/products?price[gte]=100&price[lte]=500
↕ OrderFilter
#[ApiFilter(OrderFilter::class, properties: ['createdAt', 'price'])]
Contoh Request:
GET /api/products?order[price]=desc&order[createdAt]=asc
4. Filtering Relasi
Bisa juga digunakan pada relasi (misalnya kategori produk):
#[ApiFilter(SearchFilter::class, properties: ['category.name' => 'partial'])]
Contoh Request:
GET /api/products?category.name=elektronik
5. Global vs Per Resource
-
Filter harus dideklarasikan per entitas (
#[ApiFilter(...)]) -
Tidak bisa digunakan langsung secara global di semua resource tanpa konfigurasi
6. Filtering Custom (Opsional)
Kamu bisa membuat filter kustom jika logikanya kompleks:
php bin/console make:filter
Kemudian implementasikan ApiPlatform\Doctrine\Orm\Filter\FilterInterface.
7. Kombinasi Filtering & Sorting
GET /api/products?name=book&price[gte]=100&order[createdAt]=desc
8. Tips
-
Gunakan
partialuntuk pencarian fleksibel -
Gunakan
exactuntuk data boolean, status, ID -
Pastikan properti yang difilter adalah kolom valid dari entitas
-
Gunakan OpenAPI docs untuk melihat dokumentasi otomatis
9. Contoh Lengkap
#[ApiResource]
#[ApiFilter(SearchFilter::class, properties: ['name' => 'partial', 'brand.name' => 'exact'])]
#[ApiFilter(RangeFilter::class, properties: ['price'])]
#[ApiFilter(OrderFilter::class, properties: ['price', 'createdAt'])]
class Product
{
#[ORM\Column]
private string $name;
#[ORM\Column]
private float $price;
#[ORM\Column]
private \DateTimeImmutable $createdAt;
#[ORM\ManyToOne(targetEntity: Brand::class)]
private Brand $brand;
}
10. Response Contoh
Request:
GET /api/products?price[gte]=100&order[price]=desc
Response:
{
"hydra:member": [
{ "name": "Laptop A", "price": 900 },
{ "name": "Laptop B", "price": 500 }
],
"hydra:totalItems": 2
}
Kesimpulan
✅ Gunakan SearchFilter, RangeFilter, dan OrderFilter
✅ Deklarasi filter via attribute #[ApiFilter]
✅ Bisa filter properti biasa dan relasi
✅ Sorting fleksibel dengan parameter order[field]=asc|desc
🔍 Filter & sort memudahkan pencarian dan efisiensi pada API kamu!