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

Laravel API分组商品数据适配iOS Decodable协议问题求助

解决Laravel购物车商品分组适配iOS Decodable格式问题

你可以通过集合链式处理直接将现有查询结果转换为目标格式,步骤如下:

方法一:直接处理查询结果集合

在你现有的groupBy操作后,通过map构造目标结构,并移除商品对象中冗余的category字段,最后用values()将关联集合转为索引数组:

$collection = DB::table('cart_product')
    ->where('cart_id', $validRequest['cart_id'])
    ->join('products', 'cart_product.product_id', '=', 'products.id')
    ->join('categories', 'products.category_id', '=', 'categories.id')
    ->select('categories.name as category', 'cart_product.id', 'products.name as product', 'cart_product.count')
    ->get();

// 转换为目标格式
$formatted = $collection->groupBy('category')
    ->map(function ($productsInCategory, $categoryName) {
        // 移除每个商品中的category字段
        $cleanProducts = $productsInCategory->map(function ($item) {
            unset($item['category']);
            return $item;
        });
        
        return [
            'category' => $categoryName,
            'products' => $cleanProducts
        ];
    })
    ->values(); // 将关联集合转为索引数组,匹配目标JSON结构

return $formatted;

方法二:使用Laravel资源(更规范的API输出方式)

如果希望长期维护API格式,推荐使用Laravel的资源类来统一输出结构:

1. 创建商品资源类

// app/Http/Resources/CartProductResource.php
namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class CartProductResource extends JsonResource
{
    public function toArray(Request $request): array
    {
        return [
            'id' => $this->id,
            'product' => $this->product,
            'count' => $this->count
        ];
    }
}

2. 创建分类带商品的资源类

// app/Http/Resources/CategoryWithProductsResource.php
namespace App\Http\Resources;

use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\JsonResource;

class CategoryWithProductsResource extends JsonResource
{
    public function toArray(Request $request): array
    {
        return [
            'category' => $this->category_name,
            'products' => CartProductResource::collection($this->products)
        ];
    }
}

3. 在控制器中使用资源

// 改用Eloquent关联查询(假设Cart模型已定义products关联)
$cart = \App\Models\Cart::findOrFail($validRequest['cart_id']);
$products = $cart->products()->with('category')->get();

// 分组并转换为资源格式
$grouped = $products->groupBy('category.name')
    ->map(function ($items, $categoryName) {
        return (object)[
            'category_name' => $categoryName,
            'products' => $items
        ];
    });

return \App\Http\Resources\CategoryWithProductsResource::collection($grouped->values());

两种方法最终都会输出你需要的JSON结构,完美适配iOS的Decodable协议反序列化需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 13:05:38