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)
}
- 1 回答
- 0 关注
- 111 浏览
添加回答
举报