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

Laravel接口返回格式调整:将数组结构改为对象结构

解决Laravel接口返回数组转对象结构的问题

我来帮你搞定这个接口返回格式的问题,核心原因是你当前用get()查询返回的是Eloquent集合,转成JSON后会变成数组结构。根据你的需求,分两种常见场景给出解决方案:

场景1:期望返回单个已完成购物车项(对象)

如果业务逻辑里,单个用户的已完成购物车项应该是唯一的,那直接把查询里的get()换成first()即可:

public function getCompleteItems(int $shopperId) {
    return ShopifyCart::where([
        ['shopify_shopper_id', '=', $shopperId],
        ['cart_complete', '=', 1],
    ])->first(); // 将get()替换为first()
}

first()会返回单个模型实例,转成JSON后就是标准的对象结构,而不再是数组。

场景2:需要保留多个项,但包裹在对象结构中

如果用户确实有多个已完成购物车项,但你希望把数组放到一个对象的指定属性里(比如items字段),可以通过以下两种方式处理:

方式一:在服务层包装数据

直接修改getCompleteItems方法,把查询结果包装成对象:

public function getCompleteItems(int $shopperId) {
    $items = ShopifyCart::where([
        ['shopify_shopper_id', '=', $shopperId],
        ['cart_complete', '=', 1],
    ])->get();
    
    // 包装成自定义对象结构
    return (object)[
        'items' => $items,
        'total_count' => $items->count() // 可以额外添加统计字段
    ];
}

方式二:在控制器层处理数据

如果不想改动服务层代码,就在控制器里对返回数据进行包装:

$shopperId = auth()->guard('shoppers')->user()->id;
$completedItems = $this->shopifyCartService->getCompleteItems($shopperId);
if ($completedItems) {
    // 将数组包裹到对象的items属性中
    $responseData = (object)[
        'items' => $completedItems,
        'total' => $completedItems->count()
    ];
    return $this->responseHelper->response(true, "All completed items", $responseData, 200);
}
return $this->responseHelper->response(false, "No completed item / items", null, 401);

补充说明

  • Eloquent的get()方法返回的是Collection实例,转JSON时会自动序列化为数组;而first()返回单个模型实例,序列化后是对象。
  • 用(object)可以快速把关联数组转换为stdClass对象,满足你的对象结构需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.08 16:28:02