Laravel 8.41 中的高效游标分页
发布时间 作者 Paul Redmond
Laravel 团队发布了 8.41 版本,其中包含游标分页、一种新的 Eloquent 方法用于静默更新模型、一种新的字符串方法以及 8.x 分支中的最新更改。
游标分页
Paras Malhotra 贡献了 游标分页 支持。Laravel 文档对游标分页与其他用于从数据库检索数据页面的分页方法之间的区别进行了很好的解释。
游标分页通过构建“where”子句来工作,这些子句比较查询中包含的有序列的值,从而在所有 Laravel 分页方法中提供最高效的数据库性能。这种分页方法特别适合大型数据集和“无限”滚动用户界面。
与基于偏移量的分页不同,基于偏移量的分页在分页器生成的 URL 的查询字符串中包含一个页面编号,基于游标的分页在查询字符串中放置一个“游标”字符串。
游标分页解决了在基于偏移量的分页中发现的重复问题,这些问题通常会影响无限滚动和 API 使用。游标分页在处理大型数据集时效率更高。
以下是一个快速示例,展示了它的外观。
$users = User::orderBy('id')->cursorPaginate(10);
给定上述用于十条记录的分页调用,以下是一个示例,说明如果我们在控制器中返回此实例,响应会是什么。
{ "data": [ { "id": 1, "name": "Nona Wilkinson", "email_verified_at": "2021-05-12T23:21:19.000000Z", "created_at": "2021-05-12T23:21:19.000000Z", "updated_at": "2021-05-12T23:21:19.000000Z" }, { "id": 2, "name": "Titus Feeney Sr.", "email_verified_at": "2021-05-12T23:21:19.000000Z", "created_at": "2021-05-12T23:21:19.000000Z", "updated_at": "2021-05-12T23:21:19.000000Z" }, {...} ], "path": "http://127.0.0.1:8000/users", "per_page": 10, "next_page_url": "http://127.0.0.1:8000/users?cursor=eyJpZCI6MTAsIl9wb2ludHNUb05leHRJdGVtcyI6dHJ1ZX0", "prev_page_url": null}
如您所见,您不能依赖于用于基于偏移量的分页的 ?page=2
查询参数。您必须使用提供的 next_page_url
参数来获取下一页结果。
游标分页为 Laravel 框架和生态系统带来了巨大的益处 - 祝贺 Paras Malhotra 为此做出了如此出色的贡献(以及他所做的其他许多贡献)。
静默更新模型
GitHub 用户 @YTauber 贡献了一个 Eloquent 方法,用于更新模型而不会引发任何事件。
// `updateQuietly` works like `update()` but without raising events
Str 替换方法
Selçuk Çukur 贡献了一个 Str::replace()
方法,用于与 Str
和 Stringable
类一起使用。
use Illuminate\Support\Str; Str::replace('dead', 'alive', 'PHP is dead');/* PHP is alive */ Str::of('PHP is dead')->replace('dead', 'alive');/*Illuminate\Support\Stringable {#4091 value: "PHP is alive",}*/
发行说明
您可以在下面查看新功能和更新的完整列表,以及 8.40.0 和 8.41.0 之间的差异。以下发行说明直接来自 变更日志
v8.41.0
新增
- 新增
Illuminate\Database\Eloquent\Model::updateQuietly()
(#37169) - 新增
Illuminate\Support\Str::replace()
(#37186) - 在 whereKey() 和 whereKeyNot() 中添加模型密钥提取到 id (#37184)
- 新增对 Pusher 6.x 的支持 (#37223, 819db15)
- 新增
Illuminate/Foundation/Http/Kernel::getMiddlewarePriority()
(#37271) - 新增游标分页(也称为键集分页)(#37216, #37315)
- 支持对 SQL Server 视图进行批量赋值 (#37307)
- 新增
Illuminate/Support/Stringable::unless()
(#37326)
修复
- 修复了
Illuminate\Database\Query\Builder::offset()
在非数字 $value 情况下的问题 (#37164) - 将失败的队列作业中缺失的 UUID 视为空字符串(失败驱动程序 = 数据库)(#37251)
- 修复了在 required_unless 中未要求的字段 (#37262)
- SqlServer 语法:hasTable 和 dropIfExists 的错误修复 / 支持在这些函数中使用模式名称 (#37280)
- 修复了 Windows 上的 PostgreSQL 导出和导入 (#37320)