【问题标题】:Preloading 'belongs to' associations both ways双向预加载“属于”关联
【发布时间】:2020-04-29 16:11:22
【问题描述】:

我想以类似于Django's one-to-one relationships 的方式使用 GORM 的 'belongs to' association。考虑以下示例,其中每个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

【问题讨论】:

    标签: go associations one-to-one go-gorm


    【解决方案1】:

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

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

    【讨论】:

    • 这仍然会导致相同的错误消息,invalid recursive type Profile
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2021-10-20
    相关资源
    最近更新 更多