引言

[Laravel] 趣编程之技术文章评论列表 Api 任务的开发心得

这篇文章提到,文章评论列表需要实现分页。那么分页该如何实现?以及,为什么要分页?

分页的原因

使用分页的原因很简单,在数据量非常庞大的情况下,不可能一次性把所有数据一次性返回给前端,不然前端就卡死了。所以我们使用分页的最终目的,就是优化用户的使用体验,加载的速度快,每一页数据量合理,不能让用户觉得觉得没看够,也不能看起来没玩没了。

分页的方式

page分页分析

比较容易理解的一种分页方式。

你可以选择page,或者点击上一页,或者点击下一页来跳转到不同的页面,只要给服务器传一个 page 参数即可实现。
服务器这边拿到page之后,使用limit offset来获取相应的数据。如果使用了框架,可以使用框架自带的分页服务。拿 Laravel 来说,使用 paginate()即可实现分页效果,非常的方便。这种分页方式有利有弊。

优点:

  1. 实现简单,方便,易于理解。

  2. 可以快速浏览。比如直接从第一页跳转到第十页。

  3. 对主键的顺序性要求不大。

缺点:

  1. 存在一个 limit 1000 的问题。当一次性跳转非常多页面时,limit offset 方法实现的分页会存在很多次多余的查表操作,严重的影响了查询速度。

  2. 比较适合用在桌面端。手机端不方便。

缺点 1 是可以优化的,比如使用子查询。有兴趣的伙伴可以查一查资料。

根据id分页

理解稍微有一点点困难。常见的使用场景就是,下拉刷新,上拉刷新。比如刷知乎,刷微博,直接往下拉,就会一直进入下一页,刷起来没完没了。

这里前端需要提供的参数,是一个 ID 值。如果是下拉刷新,需要提供这一页最后一条数据的 ID;如果是上拉刷新,需要提供这一页第一条数据的 ID。拿下拉刷新举例,服务器拿到 ID 后,查找 id < ID的数据就可以了。上拉刷新也是一样的道理,把 ‘<’ 换成 ‘>’ 而已。这种分页也是有利有弊:

优点:

  1. 利用主键进行查询,效率高,速度快。

  2. 适用于手机端应用。

缺点:

  1. 要求 ID 是顺序结构。

  2. 无法快速浏览,只能一页一页的来。

下面上一点具体的代码,帮助大家理解吧。

分页的具体实现方法

page分页的实现办法

基于 Laravel 框架,我们可以使用

page 参数,框架会自动加上,所以实现起来十分方便,只要传一个 page_size 就行了。paginate 的源码实现分析,可以参考这篇文章

但是使用自带的 paginate 分页会有一个坑,返回的数据结构会增加一个 meta ,是分页的具体信息。

这是不可容忍的。我们写 Api,要求做到:要什么,给什么,绝不缺少,绝不多余。meta 就属于多余,我们要去除之。

注意: collect($answer->items()) 这句话,成功去掉了我们不想要的 meta, 留下了我们需要的 data。

id分页的实现办法

某大佬写了一个库,可以轻松实现 ID 分页。github地址。不过实现起来很方便,直接手写也没问题。

轻松搞定,非常简单

总结归纳

同一个问题会有多种不同的解决方案,每一种解决方案也是多种多样的。要学会思考优点和缺点,尝试优化。然后根据不同的使用场合,挑选适合的解决方案。

发表评论

电子邮件地址不会被公开。 必填项已用*标注