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

Laravel 5.5控制器返回分页links()为空的问题排查

问题原因及解决方案

首先说下为什么会出现这个情况:
当你调用$models->links()时,它返回的是一个**HtmlString对象**,这个对象封装了分页链接的HTML内容。但当你把这个对象直接放到response()->json()里进行JSON序列化时,PHP的json_encode函数只会序列化对象的公共属性,而HtmlString的内容是存在受保护的$content属性里的,所以最终被序列化成了空值。

而当你直接return $models->links()时,Laravel会自动触发对象的__toString()方法,把HtmlString转换成对应的HTML字符串输出,所以能得到预期的分页链接。

解决办法

方法1:手动转换为字符串

直接调用HtmlString对象的__toString()方法,把它转换成字符串后再放入JSON响应:

$models= Model::with('table2', 'table3')->simplePaginate(5);
$str= "";
foreach($models as $model){ // 这里注意要加$符号,你原来的代码漏了
 $str .= $model['name']; // 或者$model->name,取决于你的模型设置
}
return response()->json([
 'rows' => $str,
 'links' => $models->links()->__toString()
], 200);

方法2:使用render()方法

links()内部其实是调用了render()方法来生成HTML,你也可以直接用render(),它同样会返回HtmlString,所以也要转成字符串:

return response()->json([
 'rows' => $str,
 'links' => $models->render()->__toString()
], 200);

方法3:返回结构化分页数据(推荐)

如果你的前端需要自己渲染分页组件(而不是直接用HTML),可以获取分页器的结构化数据,这样更灵活:

$models= Model::with('table2', 'table3')->simplePaginate(5);
$str= "";
foreach($models as $model){
 $str .= $model['name'];
}
// 获取分页的结构化数组
$pagination = $models->toArray();
return response()->json([
 'rows' => $str,
 'pagination' => [
     'current_page' => $pagination['current_page'],
     'per_page' => $pagination['per_page'],
     'next_page_url' => $pagination['next_page_url'],
     'prev_page_url' => $pagination['prev_page_url'],
     'from' => $pagination['from'],
     'to' => $pagination['to']
 ]
], 200);

另外提个小细节:你原来的循环代码里foreach($models as model)少了$符号,应该是foreach($models as $model),不然会报错哦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 08:07:34