0

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

4 回答 4

3

您的模型(结构)实际上没有意义,因为User有一个Pic数组表示“一对多”用户与图片的关系,但是您的用户本身没有 id 属性,因此不能与Pic表中的项目相关。

用户应该有一个属性Id,它将是它的主键,并且UserId是 Pic 上与之相关的外键。如果没有这两个表/实体之间的“关系”,您将无法通过查询用户来返回图片。

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

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

于 2015-04-16T16:35:31.030 回答
1

我曾经遇到过这些问题。然后我使用了加入功能。请参阅我的示例,它工作得很好:

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)
于 2015-04-16T16:25:44.023 回答
0

尝试预加载

db.Limit(pagesize).Where("updated_at > ?", date).Preload("Pics").Find(&users)
于 2020-08-19T11:45:04.887 回答
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")
}
于 2018-07-27T16:06:13.353 回答