Lewati ke konten utama

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 partial untuk pencarian fleksibel

  • Gunakan exact untuk 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!