gorm自引用预加载Preload级联展开的方法

gorm在自引用使用预加载时,通常的方法db.Preload("Children").Or("parent_user_group_id = ?", 0).Find(&ug, `parent_user_group_id is null`)只能展开一级,想要级联展开多级时可以使用如下方法:

// 表结构体定义
type UserGroup struct {
	ID                uint32 `json:"id" form:"id"`
	GroupName         string `json:"title" gorm:"column:groupname;type:varchar(30);not null;unique;" form:"title"`
	ParentUserGroupID *uint32
	ParentUserGroup   *UserGroup
	Children  []*UserGroup `json:"children" gorm:"foreignkey:parent_user_group_id;association_foreignkey:id" form:"children"`
	Remark    string       `json:"remark" gorm:"column:remark;type:text;" form:"remark"`
	CreatedAt NullTime     `json:"created_at" gorm:"column:created_at;type:datetime(3);" form:"created_at"`
}

表数据:

gorm自引用预加载Preload级联展开的方法_第1张图片

查询方法是定义一个函数用于预加载,函数递归引用

// 展开所有的UserGroup
func expandUserGroup(db *gorm.DB) *gorm.DB {
	return db.Preload("Children", expandUserGroup)
}

 查询UserGroup时使用如下方法:

    var ug []UserGroup
	// err = db.Preload("Children").Or("parent_user_group_id = ?", 0).Find(&ug, `parent_user_group_id is null`).Count(&count).Error
	err = db.Preload("Children", expandUserGroup).Or("parent_user_group_id = ?", 0).Find(&ug, `parent_user_group_id is null`).Count(&count).Error
	if err != nil {
		fmt.Println("没有找到UserGroup数据")
	} else {
		fmt.Println("UserGroup select ok")
	}
	jsdata, _ := json.Marshal(ug)
	fmt.Println(string(jsdata))

查询结果如下图

gorm自引用预加载Preload级联展开的方法_第2张图片

 gorm自引用预加载Preload级联展开的方法_第3张图片

 

你可能感兴趣的:(golang,gorm)