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

Laravel项目中如何按多列分组堆叠相同数据库结果?

Laravel多条件分组实现Shape堆叠解决方案

你当前用groupBy(['width', 'height', 'weight', 'color_id'])生成多层嵌套集合,是因为Laravel对数组形式的分组参数会按顺序逐层分组,最终形成四层嵌套结构。要得到一维的堆叠项集合(每个元素是同组的Shape对象集合),可以用以下两种方案:

方案一:自定义唯一分组键(推荐)

直接将四个字段拼接成一个唯一字符串作为分组键,这样groupBy后直接得到一维结构:

// 先查询所有Shape,再按拼接的唯一键分组
$stacks = Shape::latest()->get()->groupBy(function ($shape) {
    // 用分隔符拼接四个字段,避免字段值连在一起导致冲突(比如width=12、height=3和width=1、height=23会被误判为同一组)
    return sprintf('%s|%s|%s|%s', $shape->width, $shape->height, $shape->weight, $shape->color_id);
});

// 如果不需要保留拼接的键,只需要堆叠项集合,调用values()方法
$stackItems = $stacks->values();

这样$stackItems就是你想要的一维集合,每个元素都是一组完全匹配的Shape对象集合。

方案二:扁平化原有多层嵌套集合

如果不想修改分组方式,可以通过集合的reduce方法逐层扁平化嵌套结构:

$stacks = Shape::latest()->get()->groupBy(['width', 'height', 'weight', 'color_id']);

// 逐层合并嵌套的集合,最终得到一维结构
$flattenedStacks = $stacks->reduce(function ($result, widthGroup) {
    return $result->merge($widthGroup->reduce(function ($result, heightGroup) {
        return $result->merge($heightGroup->reduce(function ($result, weightGroup) {
            return $result->merge($weightGroup);
        }, collect()));
    }, collect()));
}, collect());

两种方案都能得到符合要求的堆叠项集合,方案一更高效简洁,也更易维护。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 03:10:25