> 备注:前面项目中用到的代码已经分享到`GitHub`中去了,并且以后所有项目中会出现的代码都会提交上去,欢迎查阅。
[![枫零落/goshop](https://gitee.com/jobhandsome/goshop/widgets/widget_card.svg?colors=4183c4,ffffff,ffffff,e3e9ed,666666,9b9b9b)](https://gitee.com/jobhandsome/goshop)
### 需求分析
* 传入任意分类编号,获取该分类下所有子分类的分类编号
* 通过获取的分类编号列表,查询对应的商品数据
### 接下来咱们就来实现以上需求:
#### 第一步:获取指定分类下的所有子分类编号
```go
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'` 这样的字符串才可以直接使用进行查询!
```go
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,
})
```
到了这一步,咱们就实现了上面需求的功能。 更多功能请持续关注!!!!!
#### 星球地址:https://t.zsxq.com/03MJM7YfI
#### **关注公众号「程序员小乔」**
![程序员小乔](https://www.qsjob.fun/zb_users/upload/2022/07/202207041451541741109.jpg "程序员小乔")
有疑问加站长微信联系(非本文作者))