基于多个条件建立一对一关系
Gorm one to one relationship based on multiple conditions
我正在尝试在 GORM 中实现一种关系,它不仅仅基于 id 外键。数据库结构快速概览:
有一个order
table,其中包含一个tableNo
列,通常是一个整数,但也可以是一个字符串(有些table是B2) . table 数字需要与 table
table 中的 table(行)相匹配(抱歉混淆了数据库 table 名称)。这种关系是通过 venueId
和 tableNo
.
完成的
如果我要在 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.
前面的方式执行此操作
希望有人觉得这有用!
我正在尝试在 GORM 中实现一种关系,它不仅仅基于 id 外键。数据库结构快速概览:
有一个order
table,其中包含一个tableNo
列,通常是一个整数,但也可以是一个字符串(有些table是B2) . table 数字需要与 table
table 中的 table(行)相匹配(抱歉混淆了数据库 table 名称)。这种关系是通过 venueId
和 tableNo
.
如果我要在 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.
前面的方式执行此操作希望有人觉得这有用!