【问题标题】:Map value from one column into another in separate tables using Gorm使用 Gorm 在单独的表中将值从一列映射到另一列
【发布时间】:2018-09-13 23:46:21
【问题描述】:

鉴于以下one-to-many 关系(一个Receipt 有多个LineItem),我想将Price 字段从Receipt 表映射到Price 字段LineItem表(对于Product 中的每个LineItem)。

收据架构

type Product struct {
ID             uint       `json:"id"`
TotalPrice     float64    `json:"total"`
LineItems      []LineItem `json:"lineItems"`

}

LineItem 架构

type LineItem struct {
    ID          uint    `json:"id"`
    ProductID   uint    `json:"productID"`
    Price       float64 `json:"price"`
}

我目前正在使用 gorm,这是一种适用于 Go 的 ORM,但我找不到支持我正在寻找的功能的功能。

【问题讨论】:

  • 我看不出你在做什么。产品价格如何(在概念上)与订单项价格相关?
  • 可以把它想象成杂货店的收据 - 如果您购买一条面包和一袋牛奶,则收据上有两个项目。一个应该显示“1 Bread @ $1.99”,另一个应该显示“1 Milk @ 3.99”。我想用来自Product 的预定义Price 填充LineItem 内的Price
  • 您需要将价格存储在两个地方吗?在数据库中,我们努力对数据进行规范化,以便每条真理都存储在一个地方。您的订单项中已有 productID 外键。这还不足以让您在查询中使用联接并检索价格吗? SELECT LineItem.*, Product.Price FROM LineItem JOIN Product ON LineItem.ProductID = Product.ID
  • 理想情况下,我们不需要在两个表中都存储价格 - 我试图找出 gorm 是否有一个不需要我手动编写 SQL 但看起来我必须 -我会试试这个说法!
  • @Sean 好像你在这里有错字。第一个结构,是Product 还是应该是Receipt

标签: go go-gorm


【解决方案1】:

假设您有 3 个表/模型,ReceiptProductLineItem,您可以在 LineItem 模型中添加引用 Product 的字段,如下所示:

type Receipt struct {
    ID             uint       `json:"id"`
    TotalPrice     float64    `json:"total"`
    LineItems      []LineItem `json:"lineItems"`
}

type Product struct {
    ID          uint    `json:"id"`
    Price       float64 `json:"price"`
}

type LineItem struct {
    ID          uint     `json:"id"`
    ProductID   uint     `json:"productID"`
    Product     *Product `json:"product"`
}

然后您可以使用gorm 的Preload 功能在每个LineItem 中填充LineItems 字段以及Product 字段的同时查询Receipt

db.Preload("LineItems").Preload("LineItems.Product").Find(&receipt)

这样您就可以通过Product 字段访问每个LineItem 中的价格信息:

for _, li in receipt.LineItems {
    fmt.Println(li.Product.Price)
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-09
    • 1970-01-01
    • 2020-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多