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

