登录
首页 >  Golang >  Go问答

双向预加载“属于”关联

来源:stackoverflow

时间:2024-03-17 08:03:27 206浏览 收藏

在 GORM 中使用“属于”关联时,可以类似于 Django 中的一对一关系。本文将探讨如何以双向方式使用“属于”关联,即查询用户时预加载其个人资料,并查询个人资料时预加载其用户。通过使用正确的模型结构和预加载功能,可以在 GORM 中实现类似于 Django 中“属于”关联的双向预加载。

问题内容

我想以类似于 django 一对一关系的方式使用 gorm 的“属于”关联。考虑以下示例,其中每个 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
}

今天关于《双向预加载“属于”关联》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>