thinkphp 8 信息流可以按唯一 id 倒序读取,并用上一页最后一条记录的 id 当游标。下一页加上 id ,首屏出现新内容时,也不会把已看过的记录挤进下一页。
只返回公开内容并校验游标
示例假定 posts 表含 id、title、status,排序以递增 ID 代表展示顺序。方法接到已有公开 GET 路由。
public function feed()
{
$query = \think\facade\Db::name('posts')
->field('id,title')
->where('status', 'published');
$raw = request()->get('before_id');
if ($raw !== null) {
$cursor = filter_var($raw, FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1],
]);
if ($cursor === false) {
return json(['message' => 'before_id 必须是正整数'], 422);
}
$query->where('id', 'order('id', 'desc')->limit(11)->select()->toArray();
$hasMore = count($rows) > 10;
$items = array_slice($rows, 0, 10);
return json([
'items' => $items,
'next_before_id' => $hasMore ? $items[9]['id'] : null,
]);
}

第 11 条只用于判断是否还有记录。游标应取已返回的第 10 条,避免跳过探测到的记录。
用上一页返回的游标继续加载
假定第一批从 ID 120 开始,返回的第 10 条为 111。客户端收到 next_before_id 后再发下一次请求。
GET /feed GET /feed?before_id=111

第二页只应包含 ID 小于 111 的公开记录。next_before_id 为 null 时停止继续加载。
插入新内容后检查是否重复
在测试库插入一条 ID 大于 120 的公开内容,然后继续使用旧游标。
GET /feed?before_id=111 GET /feed?before_id=bad
第一条请求仍从旧游标向后查,第二条应返回 422。若展示顺序按发布时间,应使用发布时间和唯一 ID 作为组合排序与游标。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











