开发的时候经常会碰到两个已经定义好的struct里含有一模一样的字段,比如下面的A和B含有的Status字段,他们的字段标签都是一致的!
如果单表查询不会有什么问题,但是联表查询的时候就会出问题了,gorm的无法正确映射到对应的值上面去。
下面来复现一下该问题:
A和B都有一样的字段:Status
type A struct {
AId int64 `json:"aid" form:"aid"`
Status int `json:"status" form:"status"`
}
type B struct {
BId int64 `json:"bid" form:"bid"`
Status int `json:"status" form:"status"`
}
现在需要联表查询,需要一个组合的struct:
type AandB struct {
A
B
}
使用gorm时,如果这样写,A或者B的Status字段值将无法被映射,因为它们冲突了,gorm无法分辨:
func GetAandBAllRows() (rows []AandB) {
Db.Table("A").Joins("inner join B on A.aid = b.bid").Find(&rows)
// select * from A inner join B on A.aid = b.bid;
}
如果想得到正确的映射,我有个笨方法:
func GetAandBAllRows() (rows []AandB) {
Db.Table("A").Select("A.status as astatus,B.status as bstatus,A.*,B.*").Joins("inner join B on A.aid = b.bid").Find(&rows)
// select A.status as astatus,B.status as bstatus,A.*,B.* from A inner join B on A.aid = b.bid;
}
并且修改结构体:
type AandB struct {
A
B
AStatus int `form:"column:astatus"`
BStatus int `form:"column:bstatus"`
}
这样就可以接收到A的status值和B的status值。