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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 04:27:00