首页 > 解决方案 > Laravel 多级分组

问题描述

如何GROUP BY在 Laravel 中进行多个级别。我试过这段代码。

我也使用toArray()then array_values(),但结果与使用相同values()

编辑:对不起,我写了 value() 而不是 values()

使用 values() 时,product_name不显示。

// Controller
$products = DB::table('product_registrations')
    // ->select(['product_name', 'color'])
       ->join('colors', 'colors.id', '=', 'product_registrations.color_id')
       ->join('sizes', 'sizes.id', '=', 'product_registrations.size_id')
       ->join('products', 'products.id', '=', 'product_registrations.product_id')
       ->get()
       ->groupBy(['product_name', 'color']);
       // ->values(); // I've used values(), it worked but first level groupBy name missing

return response()->json(['products' => $products]);

---

I want something like: 

products: [
    product1: [
        color1: {},
        color2: {}
    ]
]

没有值()

{
    "products": {
        "light blue dress": {
            "Ягаан": [
                {
                    "id": 1,
                    "product_id": 1,
                    "color_id": 1,
                    "size_id": 6,
                    "color": "Ягаан",
                    "product_name": "light blue dress",
                }
            ],
        },
    }
}

使用值()

{
    "products": [
        {
            "Ягаан": [
                {
                    "id": 1,
                    "product_id": 1,
                    "color_id": 1,
                    "size_id": 6,
                    "color": "Ягаан",
                    "product_name": "light blue dress",
                }
            ],
        }
    ]
}

标签: mysqldatabaselaraveleloquent

解决方案


试试这个。上周我也有这个问题,但我设法通过了。

$products::latest()->get();

$products = products->groupBy(function($product) {
  return $product->name;
});

$products = products->map(function($product) {
  return $product->groupBy(function($prod) {
    return $prod->color;
  });
});

return $products;

您也可以通过使用array_only此方法来优化此方法仅适用于 laravel


推荐阅读