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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.02 06:12:59