GO项目实战-获取多级分类下的全部商品

536 阅读2分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

备注:前面项目中用到的代码已经分享到GitHub中去了,并且以后所有项目中会出现的代码都会提交上去,欢迎查阅。

枫零落/goshop

需求分析

  • 传入任意分类编号,获取该分类下所有子分类的分类编号
  • 通过获取的分类编号列表,查询对应的商品数据

接下来咱们就来实现以上需求:

第一步:获取指定分类下的所有子分类编号

func (Category) GetCategoryIds(DB *gorm.DB, cateId int64) (pids map[int]int64) {
	if cateId == 0 {
		return
	}
	var Result []*Category
	// 查询全部的分类编号和pid
	DB.Select([]string{"id", "pid"}).Find(&Result)
	index := 0
	pids = make(map[int]int64)
	// 递归遍历指定分类下的全部子分类编号
	// 通过匿名函数的方式进行递归算法
	var inPids func(Result []*Category, cateId int64)
	inPids = func(Result []*Category, cateId int64) {
		if Result == nil {
			return
		}
		for _, item := range Result {
		   // 判断pid 和传入的 分类编号 相等
			if item.Pid == cateId {
				pids[index] = item.ID
				index++
				// 递归传入下一个的分类编号
				inPids(Result, item.ID)
			}
		}
	}
	// 初始化
	inPids(Result, cateId)
	return
}

第二步:对获取到的分类编号数组(hashMap)进行处理

第一步获取到的结果集是hashMap数组,无法在gorm中直接使用,需要进行处理:处理成 '1','2','3','4' 这样的字符串才可以直接使用进行查询!

var GoodsResult []*model.Goods
var resErr error
if len(pids) > 0 {
   // 定义 bytes Buffer 变量
	pidsByte := new(bytes.Buffer)
	for _, value := range pids {
	  // 通过fmt.fmt.Fprintf 进行格式化赋值处理
		_, err := fmt.Fprintf(pidsByte, "'%s',", strconv.FormatInt(value, 10))
		if err != nil {
			return
		}
	}
	pidsString := pidsByte.String()
	// 过滤,最后两个字符(',)
	pidsString = pidsString[0 : len(pidsString)-2]
	// 过滤,第一个字符(')
	pidsString = pidsString[1:]
	// 查询结果
	resErr = DB.Where("goods_cate in (?)", pidsString).Order("created_at desc").Find(&GoodsResult).Error
} else {
	resErr = DB.Order("created_at desc").Find(&GoodsResult).Error
}
// 获取数据总数量
count := DB.Find(&model.Goods{}).RowsAffected

if resErr != nil {
	utils.Fail(ctx, resErr.Error(), nil)
	return
}
utils.Success(ctx, "获取成功", gin.H{
	"count": count,
	"data":  GoodsResult,
})

到了这一步,咱们就实现了上面需求的功能。 更多功能请持续关注!!!!!

往期推荐

知识星球

星球地址:t.zsxq.com/03MJM7YfI

关注公众号「程序员小乔」