如何使用gorm填充和嵌入数组?

时间:2015-03-11 18:38:35

标签: go go-gorm

我有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)

我做错了吗?

4 个答案:

答案 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)