Laravel将Eloquent集合按name字段为键分组为数组的最优方案
Laravel Eloquent集合按指定字段分组解决方案
你之前使用keyBy、mapWithKeys只能得到最后一个元素是正常的,这两个方法的设计目标就是做单值映射,同一个键只会保留最后一个匹配项,本身就不适合分组场景。而groupBy方法使用后结果不符合预期,大概率是操作顺序错误:你提前调用了toArray()把集合转为了普通数组,再去调用集合方法自然无法生效。
你手写的foreach遍历方案本身是正确可用的,但不是唯一解决方案,Laravel已经内置了更简洁的封装实现:
最优实现代码
直接使用Eloquent集合内置的groupBy()方法,无需手动遍历:
// 分组后仍然保留集合实例,子项为ProductVariation模型对象 $groupedVariations = $variations->groupBy('name'); // 如果需要转成纯数组格式,链式调用toArray()即可 $groupedArray = $variations->groupBy('name')->toArray();
最终返回的结构完全符合你要求的以name值为键、同组数据组成子数组的格式。
自定义逻辑可选实现
如果需要额外处理分组后的子项,可以用集合的reduce方法实现,逻辑和你手写的foreach一致:
$groupedArray = $variations->reduce(function ($carry, $item) { $key = $item->name; isset($carry[$key]) || $carry[$key] = []; // 可在这里自定义子项的结构,比如只取需要的字段 $carry[$key][] = [ 'attribute_value_id' => $item->attribute_value_id, 'value' => $item->value ]; return $carry; }, []);
内容的提问来源于stack exchange,提问作者dlogon
相关产品推荐
相关产品推荐

