首页 > 解决方案 > 以两种方式预加载“属于”关联

问题描述

我想以类似于Django 的一对一关系的方式使用 GORM 的“属于”关联。考虑以下示例,其中每个都与一个相关联:UserProfile

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

在此示例中,我查询 aProfile并预加载其User. 但是,我实际上想以另一种方式执行此操作:查询 aUser并预加载其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

有没有办法user.Profile在这个 GORM 例子中得到一个?

标签: goassociationsone-to-onego-gorm

解决方案


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

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

推荐阅读