我试图在GORM中实现一个关系,而不是简单地基于id外键。数据库结构的快速概述:
有一个order
表,它包含一个tableNo
列,通常是一个整数,但也可以是一个字符串(一些表说B2)。表号需要匹配到一个表(行)在table
表(对不起混淆数据库表名称)。此关系通过venueId
和tableNo
实现。
如果我要在MySQL中写这个关系,我们可以使用以下方式连接表:
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) | tbody> <<tr> | 7 | 2229 | 表# 7 | 2229 | |
---|---|---|---|---|---|---|---|---|---|
9 | 2462 | 表# 9 | 2462 | ||||||
15 | 2229 | 表# 15 | 2229 |
我已经想出了一个解决办法。
第一个主要问题是语法错误,它阻止了GORM给我任何查询日志。gorm:"references:Title,foreignKey:TableNo" json:"table"
应该是gorm:"references:Title;foreignKey:TableNo" json:"table"
接下来,我将关系更改为venueId,因为回想一下SQL,这是连接操作正在进行的,所以我们有gorm:"foreignKey:VenueId;references:VenueId" json:"table"
最后,预加载必须包含一个与表编号值匹配的条件:
r.db.Preload("Table", "replace(`table`.title, 'Table #', '') = ?", &order.TableNo).First(&order, id)
现在的问题是如何不使用替换,并以一种除了'Table #'之外的字符串可以在tableNo前面的方式做到这一点。
希望有人发现这有用!