Filters & Pagination
Thelia's API supports filtering, sorting, and pagination through API Platform's filter system, with custom Propel adapters.
Basic usage
Filters are applied via query parameters:
GET /api/front/products?visible=true&brand.id=5&order[position]=asc&page=2&itemsPerPage=20
Available filters
SearchFilter
Exact and partial matching on text fields.
#[ApiFilter(
filterClass: SearchFilter::class,
properties: [
'ref', // Exact match
'title' => 'word_start', // Starts with (word boundary)
'productCategories.category.id', // Related entity ID
'brand.id', // Related entity ID
],
)]
Usage:
# Exact match
GET /api/admin/products?ref=PROD-001
# Partial match (word_start)
GET /api/admin/products?title=shirt
# Related entity
GET /api/front/products?brand.id=5
GET /api/front/products?productCategories.category.id=10
Match strategies:
| Strategy | Description | Example |
|---|---|---|
exact | Exact match (default) | ref=PROD-001 |
partial | Contains anywhere | title=shirt matches "T-shirt" |
start | Starts with | ref=PROD matches "PROD-001" |
end | Ends with | ref=001 matches "PROD-001" |
word_start | Word boundary start | title=blue matches "Blue shirt" |
BooleanFilter
Filter on boolean fields.
#[ApiFilter(
filterClass: BooleanFilter::class,
properties: [
'visible',
'virtual',
'productCategories.defaultCategory',
'productSaleElements.isDefault',
'productSaleElements.promo',
'productSaleElements.newness',
],
)]
Usage:
# Direct boolean
GET /api/front/products?visible=true
GET /api/front/products?virtual=false
# Related boolean
GET /api/front/products?productSaleElements.promo=true
GET /api/front/products?productSaleElements.newness=true
OrderFilter
Sort results by field.
#[ApiFilter(
filterClass: OrderFilter::class,
properties: [
'ref',
'position',
'createdAt',
'productCategories.position',
],
)]
Usage:
# Single field
GET /api/front/products?order[position]=asc
GET /api/admin/products?order[createdAt]=desc
# Multiple fields
GET /api/front/products?order[position]=asc&order[ref]=asc
# Related field
GET /api/front/products?order[productCategories.position]=asc
RangeFilter
Filter by numeric ranges.
#[ApiFilter(
filterClass: RangeFilter::class,
properties: [
'productSaleElements.productPrices.price',
'productSaleElements.productPrices.promoPrice',
'productSaleElements.weight',
'productSaleElements.quantity',
],
)]
Usage:
# Greater than
GET /api/front/products?productSaleElements.productPrices.price[gt]=50
# Less than
GET /api/front/products?productSaleElements.productPrices.price[lt]=100
# Greater than or equal
GET /api/front/products?productSaleElements.productPrices.price[gte]=10
# Less than or equal
GET /api/front/products?productSaleElements.productPrices.price[lte]=100
# Between (combine gte and lte)
GET /api/front/products?productSaleElements.productPrices.price[gte]=10&productSaleElements.productPrices.price[lte]=100