我有一个类别表,其中有一个名为children的递归字段。一个父节点可能有一个/多个子节点
type Category struct {
ID uint
Name string
ParentID *uint `gorm:"index" json:"parent_id"`
Children []Category `gorm:"foreignkey:ParentID"`
}
当我使用DB.Preload("Children").Find(&Category)
时,我只得到第一个孩子字段,但孩子也有更多的孩子。我怎么能得到所有的领域,直到孩子没有更多的孩子?
如果你为我做一个查询,这将有助于我更好地理解。
Thanks in advance
您正在进行的查询类型是:
SELECT * FROM Category;
SELECT * FROM Children WHERE id IN (<your categories>);
这似乎都很好,除了你没有一个实体的孩子,它是一个字段在同一个类别表,如果你只是
var categories []Category;
DB.Find(&categories);
你应该从你的表中得到所有的类别,从那里你可以用Where()
等过滤东西。
因为你想要一个类别的所有子元素,你可以用:
查询var categories []Category;
parentCategoryID := 1;
DB.Where("parentID = ?", parentCategoryID).Find(&categories);
这将产生所有属于单个父类的子类。
你可以遍历这些子节点,并重复调用以找到它们的所有子节点,然后你可以将它们添加到切片中以平铺数据。
// continuing from previous code snippet
var flatCategories []Category;
for _, category := range categories {
var tempCategories []Category;
DB.Where("parentID = ?", category.ID).Find(&tempCategories);
flatCategories = append(flatCategories, tempCategories...);
}
参考查询与gorm
如何使用gorm预加载
DB.Preload("Category.Category.Category").Find(&Category)
这对我有用。似乎需要将depth值传递给Preload函数。