elattar / fast-paginate
Laravel 快速分页
Requires
- php: ^7.4|^8.0|^8.1|^8.2|^8.3
- illuminate/database: ^8.37|^9.0|^10.0|^11.0
Requires (Dev)
- laravel/scout: ^9.4|^10.0
- mockery/mockery: ^1.3.3|^1.6
- orchestra/testbench: ^6|^7|^8.0|^9.0
- phpunit/phpunit: >=8.5.23|^9|^10|^11
README
关于
这是一个为 Laravel 设计的快速 limit
/offset
分页宏。它可以替代标准的 paginate
方法。
此包使用类似于“延迟连接”的 SQL 方法来实现这种加速。延迟连接是一种在应用 offset
和 limit
之后才访问请求列的技术。
在我们的案例中,我们实际上并没有进行连接,而是使用了一个带有子查询的 where in
。通过使用这种技术,我们创建了一个可以优化为特定索引以获得最大速度的子查询,然后使用这些结果来获取完整的行。
SQL 看起来可能像这样
select * from contacts -- The full data that you want to show your users. where contacts.id in ( -- The "deferred join" or subquery, in our case. select id from contacts -- The pagination, accessing as little data as possible - ID only. limit 15 offset 150000 )
尝试运行上述查询时可能会遇到错误!可能是这样的错误:
This version of MySQL doesn't yet support 'LIMIT & IN/ALL/ANY/SOME subquery.
在此包中,我们将它们作为 两个 独立的 查询 来解决这个问题!
好处可能因您的数据集而异,但这种方法允许数据库检查尽可能少的数据以满足用户的意图。
这种方法不太可能比传统的 offset
/ limit
方法表现更差,尽管这是可能的,所以请确保在您的数据上测试!
如果您想了解关于此包理论的文章,可以访问 aaronfrancis.com/2022/efficient-pagination-using-deferred-joins。
安装
此包支持 Laravel 8、9 和 10。(Laravel 8 必须是 8.37 或更高版本。)
要安装,请通过 composer 需求此包
composer require hammerstone/fast-paginate
您不需要做任何事情。服务提供程序将由 Laravel 自动加载。
用法
在任何您会使用 Model::query()->paginate()
的地方,您都可以使用 Model::query()->fastPaginate()
!就是这样!方法的签名是相同的。
同样支持关系
User::first()->posts()->fastPaginate();
一个善举
如果您觉得这有帮助,请 给我发推文 并提供前后时间!我很乐意知道 :D
到目前为止的一些社区结果