REST API
Beginner
1 min read
Filtering, Sorting, and Pagination
Example
# Query string conventions
# GET /products?status=active&category=shoes&minPrice=50&maxPrice=200
# GET /products?sort=price&order=desc
# GET /products?page=3&perPage=25 (offset-based)
# GET /products?cursor=eyJpZCI6MTAwfQ&limit=25 (cursor-based)
# Laravel implementation with Spatie QueryBuilder
use Spatie\QueryBuilder\QueryBuilder;
use Spatie\QueryBuilder\AllowedFilter;
public function index(Request $request): JsonResponse {
$products = QueryBuilder::for(Product::class)
->allowedFilters([
'status',
'category.name',
AllowedFilter::scope('price_between'),
])
->allowedSorts(['price', 'name', 'created_at'])
->allowedIncludes(['category', 'images'])
->paginate($request->input('perPage', 20));
return response()->json([
'data' => $products->items(),
'meta' => [
'currentPage' => $products->currentPage(),
'perPage' => $products->perPage(),
'total' => $products->total(),
'lastPage' => $products->lastPage(),
],
'links' => [
'first' => $products->url(1),
'last' => $products->url($products->lastPage()),
'prev' => $products->previousPageUrl(),
'next' => $products->nextPageUrl(),
],
]);
}