DEV Community

Cover image for Laravel API Pagination Strategies That Actually Scale
Saqueib Ansari
Saqueib Ansari

Posted on • Originally published at qcode.in

Laravel API Pagination Strategies That Actually Scale

When building APIs with Laravel that serve large data sets, pagination isn't just a nice-to-have—it's essential for maintaining performance and user experience. Choosing the right pagination strategy can dramatically affect your backend query efficiency and how smoothly clients can navigate large collections.

Understanding Pagination Methods in Laravel

Laravel offers several pagination methods out of the box, but not all fit every use case, especially when dealing with massive datasets or complex queries.

Offset Pagination

The classic approach, offset pagination, works by skipping a number of records and fetching the next chunk:

$users = User::orderBy('id')->skip($offset)->take($limit)->get();
Enter fullscreen mode Exit fullscreen mode

Laravel's paginate() method uses this internally:

$users = User::orderBy('id')->paginate(15);
Enter fullscreen mode Exit fullscreen mode

Pros:

  • Easy to implement
  • Works well for small to medium data sets

Cons:

  • Performance degrades with large offsets because the database scans and skips rows
  • Can cause inconsistent results if data changes between requests

Cursor Pagination

Laravel 8+ introduced native support for cursor pagination, which uses a unique key (usually an ID) to paginate without skipping rows:

$users = User::orderBy('id')->cursorPaginate(15);
Enter fullscreen mode Exit fullscreen mode

This returns a cursor that clients pass back to fetch the next page.

Pros:

  • Scales well with large datasets
  • More consistent with live data changes
  • Avoids expensive OFFSET scans

Cons:

  • Requires a unique, sequential column for ordering
  • Less intuitive for clients (cursor tokens instead of page numbers)

Keyset Pagination

Keyset pagination is conceptually similar to cursor pagination but often implemented manually for complex queries. It filters results based on the last seen record's key:

$lastId = $request->query('last_id');
$users = User::where('id', '>', $lastId)->orderBy('id')->limit(15)->get();
Enter fullscreen mode Exit fullscreen mode

Pros:

  • Extremely performant for very large datasets
  • Can be customized for composite keys or multiple ordering columns

Cons:

  • More manual work than built-in cursor pagination
  • Clients must manage the last seen key

Choosing the Right Pagination Strategy

When to Use Offset Pagination

  • Small to moderate data sets
  • When simplicity is more important than raw performance
  • When clients expect page numbers

When to Use Cursor or Keyset Pagination

  • APIs with large or growing data sets
  • When consistent pagination over frequently changing data is critical
  • To reduce database load and improve response times

Implementing Cursor Pagination in Laravel

To implement cursor pagination efficiently:

  1. Use an indexed column (usually id or created_at) for ordering.
  2. Ensure your API returns the cursor token from the previous page.
  3. Handle cursor tokens on the client side properly.

Example controller method:

use App\Models\User;
use Illuminate\Http\Request;

public function index(Request $request)
{
    $users = User::orderBy('id')->cursorPaginate(15);
    return response()->json($users);
}
Enter fullscreen mode Exit fullscreen mode

The response includes next_cursor and prev_cursor links that clients can use.

Real-World Takeaways

  • Avoid offset pagination for APIs with millions of rows. The database workload grows linearly as users request higher page numbers.
  • Cursor pagination is the Laravel-native solution for large datasets—it strikes a balance between performance and developer ergonomics.
  • Manual keyset pagination suits highly customized queries or complex sorting requirements.
  • Always index your pagination keys to maximize query speed.
  • Communicate pagination strategy clearly in your API docs so clients can implement navigation correctly.

Conclusion

Laravel's pagination methods offer flexible options to handle large data sets effectively. For modern APIs requiring scalability and consistent user experience, cursor pagination is generally the best choice in 2024 and beyond. However, understanding your data access patterns and client needs is vital to select the optimal strategy.

Explore Laravel's official documentation on pagination for the latest features and best practices.


By carefully implementing the right pagination strategy, you ensure your Laravel API remains performant, scalable, and developer-friendly even as your data grows exponentially.

Top comments (0)