【问题标题】:Unable to preload clause.Associations无法预加载子句。关联
【发布时间】:2021-01-28 05:11:44
【问题描述】:

我将 GORM 与 Fiber 结合使用。使用预加载的clause.Associations 查询所有用户时,出现以下错误:

can't preload field @@@as@@@ for entities.User

这是什么意思?如果没有clause.Associationspreload,它可以正常工作,但不会显示一对一的关联。

func UsersGetAll(c *fiber.Ctx) error {
    db := database.DBConn
    users := []entities.User{}
    records := db.Preload(clause.Associations).Find(&users)
    if records.Error != nil {
        log.Println(records.Error)
        return c.Status(500).SendString(records.Error.Error())
    }

    return c.JSON(records.Value)
}

【问题讨论】:

  • 什么是clause.Associations?你能展示你在帖子中使用的模型吗?
  • clause.Associations 来自 GORM 文档 (gorm.io/docs/preload.html#Preload-All),基本上是表达式 @@@as@@@ 用于预先加载所有关联(没有一对多和多对多)。用户模型由NameAge 等常规字段组成,但也包括Address 类型的Address 等一对一关联,我想急切地预加载它但不起作用。但是,在 preload 中明确包含一对一关联仍然有效。

标签: go go-gorm go-fiber


【解决方案1】:

看起来像是gorm标签的问题: 我会假设结构是这样的:

type Address struct {
ID int `gorm:"column:id;primaryKey"`
}
type User struct {
Name string `gorm:"column:name"`
Age string `gorm:"column:age"`
Address Address `gorm:"references:ID"`
}

还有代码:

user:=User{}
if err:=db.Preload("Address").Find(&user).Error {
panic(err)
}

我想你也应该看看这个:Gorm relationship error: need to define a valid foreign key for relations or it need to implement the Valuer/Scanner interface

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多