You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9中使用paginate()结合序列化丢失分页数据问题

问题原因

你混淆了两个不同的append()方法:

  • 分页实例(LengthAwarePaginator)的append():用于给分页链接追加URL查询参数,而非给模型添加属性
  • Eloquent模型的append():用于将访问器或自定义附加属性加入模型的数组/JSON输出

直接在分页实例上链式调用append()后再调用makeHidden(),会导致两个核心问题:

  1. 你想要的附加属性根本没加到模型上
  2. 分页实例本身没有makeHidden()方法,调用后会返回模型集合而非分页实例,因此转JSON时丢失了分页元数据
解决方案

要保留分页元数据,需针对分页结果中的每个模型进行操作,而非直接操作分页实例:

方法一:使用each()遍历处理模型

// 先获取完整的分页实例
$threads = Thread::paginate(10);

// 遍历每个模型,添加附加属性并隐藏指定字段
$threads->each(function ($thread) {
    $thread->append(['creator_info', 'thread_preview'])
           ->makeHidden(['category', 'post']);
});

// 转JSON,此时会完整保留分页元数据
return $threads->toJson();

方法二:使用transform()替换集合中的模型

$pagination = Thread::paginate(10);

// 转换集合中的每个模型,返回处理后的新模型
$pagination->getCollection()->transform(function ($thread) {
    return $thread->append(['creator_info', 'thread_preview'])
                  ->makeHidden(['category', 'post']);
});

return $pagination->toJson();

方法三:模型全局预设附加属性(可选)

如果creator_info和thread_preview是业务中全局需要的附加属性,可以在模型中提前定义$appends属性,省去每次手动调用append()的步骤:

class Thread extends Model
{
    protected $appends = ['creator_info', 'thread_preview'];

    // 对应实现访问器方法:getCreatorInfoAttribute()、getThreadPreviewAttribute()
}

之后只需处理隐藏字段:

$threads = Thread::paginate(10)->each(function ($thread) {
    $thread->makeHidden(['category', 'post']);
});

return $threads->toJson();
验证结果

处理后的JSON输出会包含完整的分页结构:

{
  "data": [...],
  "current_page": 1,
  "last_page": 5,
  "per_page": 10,
  "total": 42,
  // 其他分页元数据...
}

内容的提问来源于stack exchange,提问作者JollyGood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 01:45:34