商品分类父子级递归查询

今天做遇到一个父子级条件查询的问题,直接上手前端展示。当点击左侧的"食品"分类时,需要将其子分类对应的商品也查询出来(右侧暂时没有加查询条件~)

接下来是数据库,蓝色背景就是食品相关的分类(包括子类)。我们需要将这些分类对应的商品查询出来。按目前的数据量可以直接根据p_id=3在t_goos_type中查询数据,但是当数据量增多时(子类的子类的子类....套娃),就需要采取新的方案进行处理。

Service中的方法 

1、typeId:即前端点击的分类Id,对应上图数据库中的3(食品的id值)

2、先根据参数查询数据库中对应的数据。

3、必须分情况进行判断:A.用户点击的是"所有分类" B.用户点击的是"某个分类"。当查询的数据为-1时,用户点击的是"所有分类"。此时通过Mybatis Plus的list()方法查询出分类列表的所有数据,通过stream()流(JDK8新特性)的方式获取每个GoodsType对象中的id属性,并将其转换为List集合。(当然你也可以用for循环搞定~)</

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
gorm是一个非常流行的golang ORM库,它可以轻松地操作数据库。在gorm中,可以使用Preload方法来实现单表父子递归查询。下面是一个示例代码: ```go type Category struct { ID uint Name string ParentID uint Children []Category } func (c *Category) GetAllChildren(db *gorm.DB) error { return db.Where("parent_id = ?", c.ID).Find(&c.Children).Error } func (c *Category) GetAllDescendants(db *gorm.DB) ([]Category, error) { var descendants []Category err := db.Where("parent_id = ?", c.ID).Find(&descendants).Error if err != nil { return nil, err } for i := range descendants { children, err := descendants[i].GetAllDescendants(db) if err != nil { return nil, err } descendants[i].Children = children } return descendants, nil } func main() { db, err := gorm.Open(mysql.Open("user:password@tcp(127.0.0.1:3306)/database"), &gorm.Config{}) if err != nil { panic("failed to connect database") } var rootCategory Category err = db.First(&rootCategory, "parent_id = ?", 0).Error if err != nil { panic("failed to get root category") } err = rootCategory.GetAllChildren(db) if err != nil { panic("failed to get all children") } fmt.Printf("%+v\n", rootCategory) descendants, err := rootCategory.GetAllDescendants(db) if err != nil { panic("failed to get all descendants") } fmt.Printf("%+v\n", descendants) } ``` 在上面的代码中,我们定义了一个Category结构体,它包含了ID、Name、ParentID和Children四个字段。GetAllChildren方法用于获取当前分类的所有子分类,GetAllDescendants方法用于获取当前分类的所有后代分类。在GetAllDescendants方法中,我们使用递归的方式获取所有后代分类,并将它们存储在Children字段中。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值