如何嵌套查询子表的子表数据

我有一个很多表叫user->任务,我可以用这个查询任务:


var user models.User

    DB.Find(&user, "user_addr=?", userAddr)

    //log.Infof("find user: ", user)

    DB.Model(&user).Related(&tasks, "Tasks")

但是,在我的任务中,我有一个子表,其中包含一对多,称为子任务。如何将其作为任务中的字段进行查询。这是我的任务结构:


type Tasks struct {

    gorm.Model

    TasksID int `json:"tasks_id"`

    // TasksCreateTime is the hash value since it is unique

    //TasksHash string `json:"tasks_hash"`

    // tasks related fields

    TasksTitle string `json:"tasks_title"`

    TasksCreateTime time.Time `json:"tasks_create_time"`

    TasksComment string `json:"tasks_comment"`

    SubTasks []SubTask `json:"sub_tasks" gorm:"foreignkey:ID"`

}

我想查询数据并将其分配给子任务字段。


如何嵌套?


这种方式是否有效?


func FetchSyncTasksForUser(userAddr string, tasks *[]models.Tasks) {

    log.Infof("fetch sync tasks for user %s ", userAddr)

    var user models.User

    DB.Find(&user, "user_addr=?", userAddr)

    DB.Preload("Tasks").Preload("Tasks.SubTasks").Find(&user, "user_addr = ?", userAddr)

    tasks = &user.Tasks

}


弑天下
浏览 135回答 1
1回答

湖上湖

你试过gorm预加载功能吗?我把这个代码片段放在一起,预加载必要的模型。它将格式化的模型打印到命令行。更新:包含一个代码段,用于按用户的 ID 查找用户 https://gorm.io/docs/query.htmlpackage mainimport (    "encoding/json"    "fmt"    "gorm.io/driver/sqlite"    "gorm.io/gorm")type User struct {    gorm.Model    Name  string    Tasks []Task}type Task struct {    gorm.Model    UserId   uint    SubTasks []SubTask}type SubTask struct {    gorm.Model    TaskId uint}func main() {    db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})    if err != nil {        panic("failed to connect database")    }    // Migrate the schema    db.AutoMigrate(&User{}, &Task{}, &SubTask{})    // Create    user := User{Name: "C"}    db.Create(&user)    task := Task{UserId: user.ID}    db.Create(&task)    subTaskOne := SubTask{TaskId: task.ID}    subTaskTwo := SubTask{TaskId: task.ID}    db.Create(&subTaskOne)    db.Create(&subTaskTwo)    // Find all users, with tasks and subtasks    users := make([]User, 1)    db.Preload("Tasks").Preload("Tasks.SubTasks").Find(&users)    for _, u := range users {        jsonOutput, err := json.MarshalIndent(u, "", "  ")        if err != nil {            panic("")        }        fmt.Println(string(jsonOutput))    }    // Find only one user by user_addr with tasks and subtasks    oneUser := User{}    db.Where("user_addr = ?", user.UserAddr).Preload("Tasks").Preload("Tasks.SubTasks").First(&oneUser)    jsonOutput, err := json.MarshalIndent(oneUser, "", "  ")    if err != nil {        panic("")    }    fmt.Println(string(jsonOutput))    // Clean up    db.Delete(&subTaskTwo)    db.Delete(&subTaskOne)    db.Delete(&task)    db.Delete(&user)}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go