lampager/lampager-doctrine2
Composer 安装命令:
composer require lampager/lampager-doctrine2
包简介
Rapid pagination for Doctrine 2
README 文档
README
Lampager for Doctrine 2
Rapid pagination for Doctrine 2
Requirements
- PHP:
^8.2 - doctrine/orm:
^2.20 - lampager/lampager:
^0.5
Note
Older versions have outdated dependency requirements. If you cannot prepare the latest environment, please refer to past releases.
Installing
composer require lampager/lampager-doctrine2
Usage
Basic
Instantiate your QueryBuilder to create the Paginator.
$cursor = [ 'p.id' => 3, 'p.createdAt' => '2017-01-10 00:00:00', 'p.updatedAt' => '2017-01-20 00:00:00', ]; $result = Paginator::create( $entityManager ->getRepository(Post::class) ->createQueryBuilder('p') ->where('p.userId = :userId') ->setParameter('userId', 1) ) ->forward() ->setMaxResults(5) // Or ->limit(5) ->orderByDesc('p.updatedAt') // ORDER BY p.updatedAt DESC, p.createdAt DESC, p.id DESC ->orderByDesc('p.createdAt') ->orderByDesc('p.id') ->paginate($cursor);
It will run the optimized DQL.
SELECT * FROM App\Entities\Post p WHERE p.userId = 1 AND ( p.updatedAt = '2017-01-20 00:00:00' AND p.createdAt = '2017-01-10 00:00:00' AND p.id <= 3 OR p.updatedAt = '2017-01-20 00:00:00' AND p.createdAt < '2017-01-10 00:00:00' OR p.updatedAt < '2017-01-20 00:00:00' ) ORDER BY p.updatedAt DESC, p.createdAt DESC, p.id DESC LIMIT 6
And you'll get
object(Lampager\PaginationResult)#X (5) { ["records"]=> array(5) { [0]=> object(App\Entities\Post)#X (5) { ["id"]=> int(3) ["userId"]=> int(1) ["text"]=> string(3) "foo" ["createdAt"]=> object(DateTimeImmutable)#X (3) { ["date"]=> string(26) "2017-01-10 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } ["updatedAt"]=> object(DateTimeImmutable)#X (3) { ["date"]=> string(26) "2017-01-20 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } } [1]=> ... [2]=> ... [3]=> ... [4]=> ... } ["hasPrevious"]=> bool(false) ["previousCursor"]=> NULL ["hasNext"]=> bool(true) ["nextCursor"]=> array(2) { ["p.updatedAt"]=> object(DateTimeImmutable)#X (3) { ["date"]=> string(26) "2017-01-18 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } ["p.createdAt"]=> object(DateTimeImmutable)#X (3) { ["date"]=> string(26) "2017-01-14 00:00:00.000000" ["timezone_type"]=> int(3) ["timezone"]=> string(3) "UTC" } ["id"]=> int(6) } }
Advanced: Provide mapping for aliased columns and switch to different Hydration Mode
$result = Paginator::create( $entityManager ->getRepository(Post::class) ->createQueryBuilder('p') ->select('p.id as postId, p.userId as authorUserId, p.createdAt, p.updatedAt') // Aliasing ->where('p.userId = :userId') ->setParameter('userId', 1) ) ->forward() ->setMaxResults(5) ->orderByDesc('p.updatedAt') ->orderByDesc('p.createdAt') ->orderByDesc('p.id') ->setMapping([ 'p.id' => 'postId', 'p.userId' => 'authorUserId', ]) // Mapping ->paginate($cursor, Query::HYDRATE_ARRAY); // Hydration Mode
Questions
Seekable(Bidirectional) Query?
Sorry you can't use seekable mode since Doctrine DQL does not support UNION ALL syntax. 😢
How about Tuple Comparison?
Doctrine DQL does not support Tuple Comparison syntax! 😢
Classes
Note: See also lampager/lampager.
| Name | Type | Parent Class | Description |
|---|---|---|---|
Lampager\Doctrine2\Paginator |
Class | Lampager\Paginator |
Fluent factory implementation for Doctrine 2 |
Lampager\Doctrine2\Processor |
Class | Lampager\AbstractProcessor |
Processor implementation for Doctrine 2 |
Lampager\Doctrine2\Compiler |
Class | Compile Lampager Query into Doctrine QueryBuilder |
API
Note: See also lampager/lampager.
Paginator::__construct()
Paginator::create()
Create a new paginator instance.
static Paginator create(\Doctrine\ORM\QueryBuilder $builder): static Paginator::__construct(\Doctrine\ORM\QueryBuilder $builder)
Paginator::setMapping()
Paginator::setMapping(string[] $mapping): $this
Arguments
(string[])$mapping
An associative array that contains$columnNameOrCursorKey => $fetchedFieldName.
Paginator::aggregated()
Paginator::aggregated(bool $aggregated = true): $this
Declare that HAVING should be used instead of WHERE for aggregation.
Paginator::setMaxResults()
Alias for \Lampager\Paginator::limit().
Paginator::setMaxResults(int $limit): $this
Paginator::transform()
Transform Lampager Query into Doctrine Query.
Paginator::transform(\Lampager\Query $query): \Doctrine\ORM\Query
Paginator::build()
Perform configure + transform.
Paginator::build(\Lampager\Contracts\Cursor|array $cursor = []): \Doctrine\ORM\Query
Paginator::paginate()
Perform configure + transform + process.
Paginator::paginate(\Lampager\Contracts\Cursor|array $cursor = []): \Lampager\PaginationResult
Arguments
(mixed)$cursor
An associative array that contains$column => $valueor an object that implements\Lampager\Contracts\Cursor. It must be all-or-nothing.- For initial page, omit this parameter or pass empty array.
- For subsequent pages, pass all parameters. Partial parameters are not allowd.
lampager/lampager-doctrine2 适用场景与选型建议
lampager/lampager-doctrine2 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 10 次下载、GitHub Stars 达 7, 最近一次更新时间为 2021 年 06 月 18 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「symfony」 「paginator」 「pagination」 「doctrine」 「limit」 「offset」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 lampager/lampager-doctrine2 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 lampager/lampager-doctrine2 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 lampager/lampager-doctrine2 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
The bundle for easy using json-rpc api on your project
Symfony DataGridBundle
MongoDB Adapter to be used with Laminas Paginator
Bundle Symfony DaplosBundle
Provides a Data Grid tables for your Symfony project.
ThinkPHP6分页驱动
统计信息
- 总下载量: 10
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 7
- 点击次数: 6
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2021-06-18
