如何使用Go BUN库对一对多关系执行内连接查询?
问题:如何通过Bun ORM实现关联内连接,排除无符合条件关联数据的TableA记录
模型定义
type TableA struct { ID int Name string TableBs []*TableB `bun:"rel:has-many,join:id=table_aid"` } type TableB struct { ID int TableAID int Num int }
当前使用以下查询时,会返回TableBs字段为nil的TableA元素,无法排除这类没有匹配关联数据的记录:
db.NewSelect().Model(tableA).Relation("TableBs", func(q *bun.SelectQuery) *bun.SelectQuery { return q.Where("num = 1") })
解决方案
可以通过两种方式实现内连接效果,排除无符合条件TableB的TableA:
1. 在关联查询中指定内连接类型
Bun默认对has-many关联使用左外连接,只需在Relation方法中添加bun.JoinInner()选项,即可强制使用内连接:
db.NewSelect().Model(&tableA). Relation("TableBs", func(q *bun.SelectQuery) *bun.SelectQuery { return q.Where("num = 1") }, bun.JoinInner())
2. 使用EXISTS子查询过滤
通过子查询判断当前TableA是否存在符合条件的TableB,再结合关联查询获取匹配的关联数据:
db.NewSelect().Model(&tableA). Where("EXISTS (SELECT 1 FROM table_bs WHERE table_bs.table_aid = table_as.id AND table_bs.num = 1)"). Relation("TableBs", func(q *bun.SelectQuery) *bun.SelectQuery { return q.Where("num = 1") })
两种方式都能达到目标:只返回存在num=1的TableB关联数据的TableA记录。
内容的提问来源于stack exchange,提问作者Nelson Rivera
相关产品推荐
相关产品推荐

