pagerfanta/doctrine-mongodb-odm-adapter
Doctrine MongoDB ODM adapter for Pagerfanta. Adds pagination support for ODM query builders and queries, returning paginated results with limits, offsets, and total counts—ideal for building pageable lists in Laravel, Symfony, or custom PHP apps.
Installation
composer require pagerfanta/doctrine-mongodb-odm-adapter
Ensure doctrine/mongodb-odm and pagerfanta/pagerfanta are also installed.
Basic Usage
use Pagerfanta\Pagerfanta;
use Pagerfanta\Adapter\DoctrineODMAdapter;
use Doctrine\ODM\MongoDB\DocumentManager;
$dm = app(DocumentManager::class);
$adapter = new DoctrineODMAdapter($dm->getRepository('YourDocument'));
$pagerfanta = new Pagerfanta($adapter);
$pagerfanta->setMaxPerPage(10); // Default page size
First Use Case: Paginating Queries
$query = $dm->createQueryBuilder('YourDocument')->find();
$adapter = new DoctrineODMAdapter($query);
$pagerfanta = new Pagerfanta($adapter);
$pagerfanta->setCurrentPage(1); // Fetch first page
Dynamic Query Handling
Use DoctrineODMAdapter with QueryBuilder for flexible pagination:
$query = $dm->createQueryBuilder('User')
->field('status')->equals('active')
->sort('createdAt', 'DESC');
$adapter = new DoctrineODMAdapter($query);
Repository Integration Leverage repository methods for cleaner code:
$adapter = new DoctrineODMAdapter($dm->getRepository('User')->findAll());
Twig Blade Rendering Use Pagerfanta’s built-in view helpers:
$view = $pagerfanta->getIterator();
// Pass `$view` to your template for iteration.
Custom View Templates
Extend Pagerfanta’s SlidingView or CursorView for MongoDB-specific UX (e.g., scroll-based pagination).
Cursor-Based Pagination For large datasets, use cursor-based pagination:
$query = $dm->createQueryBuilder('User')->sort('id', 'ASC');
$adapter = new DoctrineODMAdapter($query, 10, 0, ['cursor' => true]);
Projection for Efficiency Limit fetched fields to reduce payload:
$query->fields()->include('id')->include('name');
Cursor vs. Offset Limiting
MongoDB’s skip() (offset) is inefficient for large datasets. Prefer cursor-based pagination or limit() + sort().
// Avoid:
$query->skip(100)->limit(10); // Bad for large offsets
// Use:
$query->sort('id', 'ASC')->limit(10); // Better for cursor pagination
Hydration Overhead Pagerfanta loads all documents into memory for counting. For large datasets:
setUseOutputFromHydrator(true) to reduce memory.countDocuments()).Adapter Validation
Ensure the adapter receives a valid QueryBuilder or Repository:
if (!$adapter->getQueryBuilder()) {
throw new \RuntimeException('Invalid QueryBuilder provided.');
}
MongoDB-Specific Errors
Handle MongoDB\Driver\Exception\Exception for connection/query issues:
try {
$pagerfanta->getCurrentPageResults();
} catch (\MongoDB\Driver\Exception\Exception $e) {
\Log::error('MongoDB pagination error: ' . $e->getMessage());
}
Custom Counting
Override getNbResults() for complex aggregations:
class CustomAdapter extends DoctrineODMAdapter {
public function getNbResults() {
return $this->queryBuilder->getQuery()->count();
}
}
Integration with API Platform
Use Pagerfanta’s ApiExtension for automatic pagination in API responses:
# config/packages/api_platform.yaml
api_platform:
pagination:
enabled: true
client_items_per_page: true
Caching Results
Cache paginated results with Pagerfanta\Cache\Adapter:
use Pagerfanta\Cache\DoctrineCacheAdapter;
$cache = new DoctrineCacheAdapter($dm->getCache());
$pagerfanta->setCache($cache);
How can I help you explore Laravel packages today?