【问题标题】:How to do a one-to-one relationship in GORM?如何在 GORM 中建立一对一的关系?
【发布时间】:2017-11-02 21:03:43
【问题描述】:

我有一系列Product 类型的类别。它们只有 3 个,所以我可以为每个创建一个表。让我们称他们为SubProductASubProductBSubProductC。它们足够不同,以至于将它们存储在父表 Product 中会造成混乱。

所以很自然,我只允许主键成为链接回产品的外键。但是,GORM 似乎无法像这样预加载任何字段。以下是我所拥有的(作为示例)其中之一:

type SubProductA struct {
  ProductID uint64 `gorm:"primary_key;ForeignKey:ProductID"`
  Product Product
  CreatedAt           time.Time
  UpdatedAt           time.Time
  DeletedAt           *time.Time
}

但是,当我运行类似

的查询时
db.Where("product_id=?", p.ID).Preload("Product").First(&subProduct).Error

结果是:

Can't preload field Product for models.SubProductA

我怀疑这是因为我也没有正确地将主键识别为外键。但是,我尝试了很多不同的方法,但我得到了同样的错误。

有没有办法让它工作?

【问题讨论】:

    标签: go one-to-one go-gorm


    【解决方案1】:

    为路过的人回答我自己的问题...

    似乎 GORM 在多级一对一关系方面存在问题。对于单个级别,我给出的示例,它不需要任何其他东西就可以工作。但是,要在树上更远的位置对同样具有相同键的一对一字段进行预加载,我需要执行以下操作:

    type SubSubProductA struct {
      SubProductID uint64 `gorm:"primary_key"`
      SubProductA SubProductA `gorm:"ForeignKey:SubProductID`"
      CreatedAt           time.Time
      UpdatedAt           time.Time
      DeletedAt           *time.Time
    }
    

    换句话说,ForeignKey 部分位于对象本身。这为我修复了预加载。希望这可以帮助某人。除了常见情况,GORM 文档很少。

    【讨论】:

      【解决方案2】:

      GORM 现在支持嵌套预加载。您可以查看docs here

      【讨论】:

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