我有 2 个结构,其数据如下:
type User struct {
Pics Pic[]
}
type Pic struct {
Id int
UserId int64
}
虽然每次我插入用户时,每次我找到用户时,每张图片都会插入到他们的桌子上,但不会填充图片:
var users []User
db.Limit(pagesize).Where("updated_at > ?", date).Find(&users)
难道我做错了什么?
您的模型(结构)实际上没有意义,因为User
有一个Pic
数组表示“一对多”用户与图片的关系,但是您的用户本身没有 id 属性,因此不能与Pic
表中的项目相关。
用户应该有一个属性Id
,它将是它的主键,并且UserId
是 Pic 上与之相关的外键。如果没有这两个表/实体之间的“关系”,您将无法通过查询用户来返回图片。
由于示例不完整,我不确定您需要做什么才能使您的代码正常工作,但您首先需要的是一个Id
属性,您应该将其指定为带有 gorm 注释的 Primarykey。您还应该在 Pic 结构上添加注释,说明 UserId 是外键,Id 是主键。
此外,仅供参考,您的阵列未嵌入。嵌入是您未使用的语言功能,如果您嵌入没有名称的属性,并且可以直接从嵌入类型的实例访问它的属性。
我曾经遇到过这些问题。然后我使用了加入功能。请参阅我的示例,它工作得很好:
type FileType struct {
Id int
}
type File struct {
Id int
FileType `xorm:"extends"`
}
file := File{Id: id}
has, err := eng.
Join("INNER", "FileType", "FileType.IdFileType = File.IdFileType").
Get(&file)
尝试预加载
db.Limit(pagesize).Where("updated_at > ?", date).Preload("Pics").Find(&users)
你现在可能知道了。您必须像创建一个具有一对多关系的 SQL 表一样思考。这是一个例子:
type Entry struct {
ID int
Name string
...
ContainerID int
}
type Container struct {
ID int
Tag int
Name string
...
Entries []Entry `gorm:"foreignkey:ContainerID"`
}
诀窍是填充它。我还没有找到一次尝试的方法。对于每一个这样的依赖,你必须运行类似的东西:
c := getContainerFromDB(...)
if err := getROConn().Model(c).Related(&c.Entries, "Entries").Error; err != nil {
return errors.Wrap(err, "error getting container field")
}