Laravel Eloquent使用where方法查询时,仅offers_id为1返回数组、其他值返回对象的问题咨询
问题原因与解决办法
这个问题我之前也碰到过,本质是Laravel的Collection集合在序列化为JSON时的默认行为导致的:
为什么会出现数组/对象两种格式?
当你用SubOffer::get()->where(...)(更规范的写法其实是SubOffer::where(...)->get())查询时,返回的是Laravel的Illuminate\Database\Eloquent\Collection实例。当这个集合要转成JSON返回时,Laravel会做一个判断:
- 如果集合的键是从0开始的连续整数序列(比如
[0,1,2]),就会序列化为JSON数组,也就是你看到offers_id=1时的格式; - 如果集合的键不是连续的、或者不是从0开始(比如你例子里的
[3]),就会序列化为JSON对象。
那为什么offers_id>1时键会变成非0开头的数字?大概率是你的集合在生成过程中保留了非连续的键——比如可能之前对集合做过排序、过滤、keyBy()之类的操作,或者底层查询返回的结果集索引被意外保留了。不过不管具体原因是什么,解决思路都是统一的:重置集合的键,让它变回连续的索引。
快速解决办法
这里有几个简单的方案,任选其一就能让所有情况都返回JSON数组格式:
- 用
values()重置集合键
这是最推荐的方式,它会返回一个新的集合,键被强制重置为从0开始的连续整数:
$subOffers = SubOffer::where('offers_id', 4)->get()->values();
之后再返回这个集合,转JSON就会是标准的数组格式了。
- 直接转成原生PHP数组
如果你不需要保留集合的方法,可以直接转成纯数组,原生数组的索引本来就是连续的:
$subOffers = SubOffer::where('offers_id', 4)->get()->toArray();
- API返回时配合
response()->json()
如果你是在写API接口,直接把处理后的集合传给response()->json()即可:
return response()->json(SubOffer::where('offers_id', $yourId)->get()->values());
验证效果
比如你之前offers_id=4的情况,用values()处理后,集合的键会变成0,转JSON就会输出:
[{"id":4,"offers_id":"4","price":"12,341","start_date":"2022-07-10","stop_date":"2022-07-13","additional_info":null}]
和offers_id=1的格式完全一致啦~
内容的提问来源于stack exchange,提问作者MarFezzzz
相关产品推荐
相关产品推荐

