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

