如何构建关联以查询指定分类下所有去重的ProductSpecData数据
实现指定分类下商品规格数据查询(含去重)
首先请确保你已经提前定义好模型间的关联关系:
- Category模型下定义
products一对多关联指向Product模型 - Product模型下定义
specData一对多关联指向ProductSpecData模型 - ProductSpecData模型下定义
product反向关联指向Product模型
方案1:Eloquent关联+集合去重(写法简单,适合中小数据量)
直接基于你给出的$category->products()写法扩展即可:
// 直接通过关联链获取去重后的规格数据 $uniqueSpecData = $category->products() ->with('specData') // 预加载关联避免N+1查询 ->get() ->pluck('specData') // 提取所有商品关联的规格数据 ->flatten() // 将二维集合压平为一维ProductSpecData集合 ->unique('id'); // 按规格主键ID去重
方案2:查询构造器SQL层面去重(性能更高,适合大数据量场景)
如果分类下商品和规格数据量较大,推荐直接从规格表发起查询,在数据库层面完成过滤去重,减少内存消耗:
$uniqueSpecData = ProductSpecData::whereHas('product', function ($query) use ($category) { // 筛选关联商品属于指定分类 $query->where('category_id', $category->id); }) ->distinct() // SQL层面直接去重 ->get();
提示:上述代码中的关联名
specData请替换为你实际在Product模型中定义的ProductSpecData关联方法名。
内容的提问来源于stack exchange,提问作者Ember
相关产品推荐
相关产品推荐

