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

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数组格式:

  1. 用values()重置集合键
    这是最推荐的方式,它会返回一个新的集合,键被强制重置为从0开始的连续整数:
$subOffers = SubOffer::where('offers_id', 4)->get()->values();

之后再返回这个集合,转JSON就会是标准的数组格式了。

  1. 直接转成原生PHP数组
    如果你不需要保留集合的方法,可以直接转成纯数组,原生数组的索引本来就是连续的:
$subOffers = SubOffer::where('offers_id', 4)->get()->toArray();
  1. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 19:52:44