go - 以两种方式预加载“属于”关联
问题描述
我想以类似于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)
}
在此示例中,我查询 aProfile
并预加载其User
. 但是,我实际上想以另一种方式执行此操作:查询 aUser
并预加载其Profile
.
据我了解,在 Django 中,您可以同时访问profile.user
和user.profile
,但是如果我尝试向模型中添加Profile
和ProfileID
字段,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 例子中得到一个?
解决方案
我认为您的问题是使用Profile
与类型相同的名称。如果您的User
结构看起来像这样,它应该可以工作:
type User struct {
gorm.Model
Name string
UserProfile Profile
UserProfileID uint
}
推荐阅读
- android - Android Pie下透明是错误的
- java - 在 Java 中签名扩展任意长度的位模式的最有效方法是什么?
- asynchronous - 在一个方法中多次调用异步方法时的 ASP NET MCV 性能(线程处理)
- html - 选择元素下的一些文本
- java - 使用 Gradle 将 Java 代码库编译为 10 和 8
- php - 如何使用 PHP 和 Python 将命令发送到连接到 RPi 的 USB 继电器?
- vue.js - 如何将 vue.js 与 gapi 连接起来
- c - 文档中函数参数中的数字?
- cognos - 如何在不同的操作系统上分发 Cognos 组件?
- javascript - 在 React 中循环数据时如何向网格系统添加断点