golang mysql gorm 递归查询单表
时间: 2023-12-02 19:43:22 浏览: 303
以下是使用Golang的gorm库进行递归查询单表的示例代码:
```go
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
)
type Category struct {
ID uint
Name string
ParentID uint
Children []Category `gorm:"foreignKey:ParentID"`
}
func main() {
// 连接MySQL数据库
dsn := "user:password@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
// 自动迁移模式,创建categories表
db.AutoMigrate(&Category{})
// 创建分类数据
db.Create(&Category{Name: "电子产品"})
db.Create(&Category{Name: "手机", ParentID: 1})
db.Create(&Category{Name: "电脑", ParentID: 1})
db.Create(&Category{Name: "笔记本电脑", ParentID: 3})
db.Create(&Category{Name: "台式电脑", ParentID: 3})
db.Create(&Category{Name: "家具"})
db.Create(&Category{Name: "沙发", ParentID: 7})
db.Create(&Category{Name: "床", ParentID: 7})
// 递归查询分类数据
var categories []Category
db.Preload("Children").Where("parent_id = ?", 0).Find(&categories)
printCategories(categories, 0)
}
func printCategories(categories []Category, level int) {
for _, category := range categories {
fmt.Printf("%s%d. %s\n", getIndent(level), category.ID, category.Name)
printCategories(category.Children, level+1)
}
}
func getIndent(level int) string {
var indent string
for i := 0; i < level; i++ {
indent += " "
}
return indent
}
```
上述代码中,我们定义了一个Category结构体,其中包含ID、Name、ParentID和Children四个字段。其中,ParentID表示当前分类的父分类ID,Children表示当前分类的子分类列表。在查询时,我们使用Preload方法预加载Children字段,以便在查询结果中包含子分类数据。然后,我们使用Where方法指定ParentID为0,即查询所有顶级分类数据。最后,我们使用printCategories函数递归打印分类数据,其中getIndent函数用于生成缩进字符串,以便在输出时区分不同层级的分类。
阅读全文