为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

Go
弑天下 2022-08-15 10:25:22
我有一个很多表叫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}
查看完整描述

1 回答

?
湖上湖

TA贡献2003条经验 获得超2个赞

你试过gorm预加载功能吗?我把这个代码片段放在一起,预加载必要的模型。它将格式化的模型打印到命令行。


更新:包含一个代码段,用于按用户的 ID 查找用户 https://gorm.io/docs/query.html


package main


import (

    "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)

}


查看完整回答
反对 回复 2022-08-15
  • 1 回答
  • 0 关注
  • 110 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号