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

Laravel查询结果合并同键分组,将同分类类型转为数组求助

Laravel 查询分组合并关联数据解决方案

你需要按nama_kategori分组,将对应的nama_tipe合并为数组(单个值时保留字符串),以下两种方案可以实现:

方案一:数据库层面聚合处理

利用数据库的GROUP_CONCAT函数合并关联数据,再在Laravel中转换为数组:

use Illuminate\Support\Facades\DB;

$kategori = KategoriProduk::select(
    'kategori_produks.nama as nama_kategori',
    DB::raw('GROUP_CONCAT(DISTINCT tipe_produks.layanan) as nama_tipe')
)
->leftJoin('tipe_produks', 'tipe_produks.kategori_produk_id', '=', 'kategori_produks.id')
->groupBy('kategori_produks.id', 'kategori_produks.nama')
->get()
->map(function($item) {
    $tipeArray = explode(',', $item->nama_tipe);
    // 单个值时返回字符串,多个值返回数组
    $item->nama_tipe = count($tipeArray) > 1 ? $tipeArray : $tipeArray[0];
    return $item;
});
  • 加入DISTINCT可以避免重复的nama_tipe值
  • 依赖数据库支持GROUP_CONCAT(MySQL默认支持,其他数据库需替换对应函数,比如PostgreSQL用STRING_AGG)

方案二:Laravel Collection 分组处理

如果不想依赖数据库聚合函数,可以查询所有数据后用Collection的方法分组整理:

$kategori = KategoriProduk::select('kategori_produks.nama as nama_kategori', 'tipe_produks.layanan as nama_tipe')
    ->leftJoin('tipe_produks', 'tipe_produks.kategori_produk_id', '=', 'kategori_produks.id')
    ->get()
    ->groupBy('nama_kategori')
    ->map(function($group) {
        $tipeList = $group->pluck('nama_tipe')->filter()->unique()->values();
        return [
            'nama_kategori' => $group->first()->nama_kategori,
            'nama_tipe' => $tipeList->count() > 1 ? $tipeList->toArray() : $tipeList->first()
        ];
    })
    ->values(); // 重置集合索引为连续数字
  • filter()用于过滤空的nama_tipe(如果存在无关联tipe的分类)
  • unique()确保nama_tipe无重复值

你之前使用distinct()无效,是因为distinct()是对整行数据去重,而不是按分组合并关联字段,所以无法达到预期效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 11:56:07