[GO] 内嵌结构体成员名字冲突 gorm映射错误问题

2 篇文章 0 订阅

开发的时候经常会碰到两个已经定义好的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值。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值