我有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)
我做错了吗?
答案 0 :(得分:2)
你的模型(结构)真的没有意义,因为User
有一个Pic
数组表示“一对多”。用户与pics关系,但您的用户本身没有id属性,并且与Pic
表上的项无关。
用户应拥有属性Id
,这将是它的主键,而UserId
是Pic上与其相关的外键。没有'关系'在这两个表格/实体之间,您无法通过查询用户来返回图片。
由于示例不完整,我不确定您需要做什么才能使代码正常工作,但您需要的第一件事就是Id
属性,您应将其指定为带有gorm注释的Primarykey 。您还应该在Pic结构上注释,UserId是外键,Id是它的主键。
另外,只是fyi你的数组没有嵌入。嵌入是您不使用的语言功能,如果您嵌入了没有名称的属性,则可以直接从嵌入类型的实例访问它的属性。
答案 1 :(得分:1)
我曾经遇到过这些问题。然后我用了Join函数。 看看我的例子很好用:
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)
答案 2 :(得分:0)
您现在可能已经知道了。您必须考虑好像要创建具有一对多关系的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")
}
答案 3 :(得分:0)
尝试Preload
db.Limit(pagesize).Where("updated_at > ?", date).Preload("Pics").Find(&users)