gpt4 book ai didi

go - 双向预加载“属于”关联

转载 作者:行者123 更新时间:2023-12-01 21:14:43 28 4
gpt4 key购买 nike

我想以类似于'belongs to' association的方式使用GORM的Django's one-to-one relationships。考虑以下示例,其中每个User与一个Profile相关联:

package main

import (
"fmt"
"os"

"github.com/jinzhu/gorm"
_ "github.com/jinzhu/gorm/dialects/sqlite"
"github.com/sirupsen/logrus"
)

type User struct {
gorm.Model
Name string
}

func (user User) String() string {
return fmt.Sprintf("User(Name=%s)", user.Name)
}

type Profile struct {
gorm.Model
UserID uint
User User
Name string
}

func (profile Profile) String() string {
return fmt.Sprintf("Profile(Name=%s, User=%d)", profile.Name, profile.UserID)
}

func (user *User) AfterCreate(scope *gorm.Scope) error {
profile := Profile{
UserID: user.ID,
Name: user.Name,
}

return scope.DB().Create(&profile).Error
}

const dbName = "examplegorm.db"

func main() {
db, err := gorm.Open("sqlite3", dbName)
if err != nil {
logrus.Fatalf("open db: %v", err)
}
defer func() {
db.Close()
os.Remove(dbName)
}()

db.LogMode(true)
db.AutoMigrate(&User{})
db.AutoMigrate(&Profile{})

user := User{Name: "jinzhu"}
if err := db.Create(&user).Error; err != nil {
logrus.Fatalf("create user: %v", err)
}

var profile Profile
if err := db.Where(Profile{UserID: user.ID}).Preload("User").First(&profile).Error; err != nil {
logrus.Fatalf("get profile: %v", err)
}

logrus.Infof("profile: %v", profile)
logrus.Infof("user: %v", profile.User)
}

在此示例中,我查询 Profile并预加载其 User。但是,实际上,我实际上想这样做:查询 User并预加载其 Profile

据我了解,在Django中,您可以同时访问 profile.useruser.profile,但是如果我尝试将 ProfileProfileID字段添加到 User模型中,
type User struct {
gorm.Model
Name string
Profile
ProfileID uint
}

我收到“无效的递归类型”错误:
# command-line-arguments
./gorm_belongs_to.go:23:6: invalid recursive type Profile

在此GORM示例中,有什么方法可以获取 user.Profile

最佳答案

我认为您遇到的问题是使用的名称Profile与类型相同。
如果您的User结构看起来像这样,它应该可以工作:

 type User struct {
gorm.Model
Name string
UserProfile Profile
UserProfileID uint
}

关于go - 双向预加载“属于”关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59708289/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com