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
相关产品推荐
相关产品推荐

