如何使用gorm填充和嵌入阵列?

如何使用gorm填充和嵌入阵列?,go,go-gorm,Go,Go Gorm,我有两个数据结构,如下所示: type User struct { Pics Pic[] } type Pic struct { Id int UserId int64 } 虽然每次我插入用户时,每次我找到用户时,都会将每个图片插入到它们的表中,但不会填充图片: var users []User db.Limit(pagesize).Where("updated_at > ?", date).Find(&users) 我做错什么了吗?我曾经有过这些问题。然后

我有两个数据结构,如下所示:

type User struct {
  Pics Pic[]
}

type Pic struct {
  Id int   
  UserId int64
}
虽然每次我插入用户时,每次我找到用户时,都会将每个图片插入到它们的表中,但不会填充图片:

var users []User
db.Limit(pagesize).Where("updated_at > ?", date).Find(&users)

我做错什么了吗?

我曾经有过这些问题。然后我使用了连接函数。 请参见我的示例,该示例运行良好:

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)

我曾经有过这些问题。然后我使用了连接函数。 请参见我的示例,该示例运行良好:

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)
您的模型(结构)没有真正的意义,因为
User
具有
Pic
数组表示“一对多”用户与pics的关系,但是您的用户本身没有id属性,并且不能与
Pic
表上的项相关联

用户应该有一个属性
Id
,它将是用户的主键,
UserId
是Pic上与其相关的外键。如果没有这两个表/实体之间的“关系”,就不可能通过查询用户来返回PIC

我不确定您需要做什么才能使代码正常工作,因为示例不完整,但您首先需要的是
Id
属性,您应该将该属性指定为带有gorm注释的Primarykey。您还应该在Pic结构上有注释,说明UserId是外键,Id是主键

另外,仅供参考,您的阵列未嵌入。嵌入是一种不使用的语言功能,如果嵌入属性,则该属性没有名称,并且可以直接从嵌入类型的实例访问其属性。

您的模型(结构)没有什么意义,因为
User
具有
Pic
数组表示“一对多”用户与pics的关系,但是您的用户本身没有id属性,因此不能与
Pic
表中的项目相关联

用户应该有一个属性
Id
,它将是用户的主键,
UserId
是Pic上与其相关的外键。如果没有这两个表/实体之间的“关系”,就不可能通过查询用户来返回PIC

我不确定您需要做什么才能使代码正常工作,因为示例不完整,但您首先需要的是
Id
属性,您应该将该属性指定为带有gorm注释的Primarykey。您还应该在Pic结构上有注释,说明UserId是外键,Id是主键


另外,仅供参考,您的阵列未嵌入。嵌入是一种不使用的语言功能,如果嵌入属性,则该属性没有名称,并且可以直接从嵌入类型的实例访问它的属性。

您现在可能已经知道了。您必须像创建一个具有1对多关系的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")
}

你现在可能知道了。您必须像创建一个具有1对多关系的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")
}
试一试

试一试


我没有使用gorm的经验,但是您的查询是否返回pic数据?不,这就是问题所在,它不会在阵列上返回任何内容。我没有使用gorm的经验,但是您的查询是否返回pic数据?不,这就是问题所在,它不会在阵列上返回任何内容