基于多个条件建立一对一关系

Gorm one to one relationship based on multiple conditions

我正在尝试在 GORM 中实现一种关系,它不仅仅基于 id 外键。数据库结构快速概览:

有一个order table,其中包含一个tableNo列,通常是一个整数,但也可以是一个字符串(有些table是B2) . table 数字需要与 table table 中的 table(行)相匹配(抱歉混淆了数据库 table 名称)。这种关系是通过 venueIdtableNo.

完成的

如果我要在 MySQL 中写下这种关系,我们可以使用以下方法加入 table:

select o.tableNo, o.venueId, t.title, t.venueId from order o left join table t on t.venueId = o.venueId where replace(t.title, "Table #", '') = o.tableNo order by o.createdAt desc;

tableNo (order) venueId (order) title (table) venueId (table)
7 2229 Table #7 2229
9 2462 Table #9 2462
15 2229 Table #15 2229

在我的模型中,我写了以下内容:

type Order struct {
    Id      int    `json:"id,omitempty"`
    VenueId int    `gorm:"column:venueId" json:"venueId,omitempty"`
    TableNo string `gorm:"column:tableNo" json:"tableNo,omitempty"`
    Table   Table  `gorm:"references:Title,foreignKey:TableNo" json:"table"`
}
type Table struct {
    Id      int    `gorm:"column:id" json:"id,omitempty"`
    VenueId int    `gorm:"column:venueId" json:"venueId,omitempty"`
    Title   string `gorm:"column:title" json:"title,omitempty"`
}

显然缺少某些东西,即替换 table 模型中的 tableNo。我还需要使用 venueId 将 table 对象连接到订单。 Gorm 当前给出了一个错误 need to define a valid foreign key for relations or it need to implement the Valuer/Scanner interface ,即使我指定的关系不完整。

我目前的解决方案只是手动执行查询,因为这是 GORM 无论如何都会对预加载执行的操作。 (即 order.Table = query_result)

如果您对如何以简洁的方式表达这种关系有任何建议,我将不胜感激。

谢谢

我想出了解决办法。

第一个主要问题是语法错误,导致 GORM 无法向我提供任何查询日志。 gorm:"references:Title,foreignKey:TableNo" json:"table" 应该是 gorm:"references:Title;foreignKey:TableNo" json:"table"

接下来我改变了与 venueId 的关系,因为回想 SQL 这是进行连接操作的对象,所以我们有 gorm:"foreignKey:VenueId;references:VenueId" json:"table"

最后,预加载必须包含一个条件以匹配 table 数值:

r.db.Preload("Table", "replace(`table`.title, 'Table #', '') = ?", &order.TableNo).First(&order, id)

现在的问题是如何不使用替换并以 'Table #' 以外的字符串可以在 tableNo.

前面的方式执行此操作

希望有人觉得这有用!