golang gorm mysql 单表父子级递归查询
时间: 2023-12-02 17:43:20 浏览: 253
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字段中。
阅读全文