Laravel中如何合并多个订单商品对象为单个数组
问题:合并指定客户所有订单的已购商品数据
需求为合并指定客户的所有已购商品数据,用于展示订单商品列表。
当前控制器代码
$orders = Order::where('customer_id', 1)->pluck('products'); print_r($orders);
当前返回结果结构
执行上述代码后得到的返回结构如下:
Array ( [0] => [ {"id":3,"product_id":3,"size":"47","quantity":7,"name":"Simple Regular T-shirt","price":2200,"thumbnail":"Thumbnail_614291597.jpg"}, {"id":7,"product_id":4,"size":"47","quantity":8,"name":"Simple Regular Shirt","price":123,"thumbnail":"Thumbnail_91520734.jpg"} ] [1] => [ {"id":9,"product_id":3,"size":"45","quantity":2,"name":"Simple Regular T-shirt","price":2200,"thumbnail":"Thumbnail_614291597.jpg"} ] )
期望结果
需要把所有订单下的商品合并到同一个数组中,结构如下:
Array ( [0] => [ {"id":3,"product_id":3,"size":"47","quantity":7,"name":"Simple Regular T-shirt","price":2200,"thumbnail":"Thumbnail_614291597.jpg"}, {"id":7,"product_id":4,"size":"47","quantity":8,"name":"Simple Regular Shirt","price":123,"thumbnail":"Thumbnail_91520734.jpg"}, {"id":9,"product_id":3,"size":"45","quantity":2,"name":"Simple Regular T-shirt","price":2200,"thumbnail":"Thumbnail_614291597.jpg"} ] )
已尝试方案
- 尝试将数据转为数组后调用
array_merge()合并,但该方法需要固定传入待合并的数组,实际场景下用户订单数量动态不确定,无法适用 - 尝试通过循环逻辑处理,未成功实现效果
解决方案
你调用pluck()拿到的结果本身就是Laravel集合实例,不需要手动转数组再调用原生数组合并函数,直接调用集合自带的collapse()方法即可自动合并所有子数组,适配任意数量的动态订单:
// 调用collapse后会自动遍历所有订单,把每个订单下的商品提取到同一个集合中 $allProducts = Order::where('customer_id', 1)->pluck('products')->collapse(); // 如果需要转成原生PHP数组,追加toArray()即可 $allProductsArray = $allProducts->toArray();
相关说明
collapse()是Laravel集合的原生方法,会自动遍历集合内所有元素,把每个子数组/子集合的元素全部提取到顶层,不需要手动写循环,也不需要提前知道订单总数量- 如果你当前
products字段存储的是JSON字符串、模型未做类型转换,先在Order模型中给products字段添加数组类型转换,后续操作就不需要手动处理JSON解码:// 在Order模型内部添加 protected $casts = [ 'products' => 'array', ]; collapse()会自动跳过空订单、非数组类型的异常值,兼容性比原生手动合并更好。
原生PHP备选方案
如果不想依赖集合方法,也可以用参数解包配合array_merge()实现动态数量数组合并:
$orders = Order::where('customer_id', 1)->pluck('products')->toArray(); // 用...操作符解包所有子数组传入array_merge,支持任意数量的子数组 $allProducts = array_merge(...$orders);
注意:该方案要求$orders内的所有元素都必须是数组类型,如果存在空订单会抛出错误,生产环境优先使用集合collapse()方案。
内容的提问来源于stack exchange,提问作者Creatique IT
相关产品推荐
相关产品推荐

