gorm,根据A表的id,查询B表中的信息,其中A.id=B.aid
时间: 2024-12-10 15:41:11 浏览: 27
在 GORM (Go的 ORM) 中,如果你有一个关联关系,比如两个 Go 数据库模型 A
和 B
,其中 A
拥有外键 aid
来关联 B
表,你可以使用 GORM 的查询功能轻松地通过 A
的 ID 查询相关的 B
记录。假设 A
和 B
的结构体定义类似这样:
type A struct {
gorm.Model // GORM 默认包含 id 字段
BID uint // A表中的aid字段
}
type B struct {
gorm.Model
Name string
Aid uint // B表中的aid字段,对应A表中的AID
}
你可以这样做来获取 B
中的相关数据:
func (a *A) GetRelatedB() (*B, error) {
b := &B{}
db.First(b, a.BID)
return b, db.Error
}
在这个例子中,First
函数会查找第一个 B
的记录,其 Aid
等于 A
的 BID
。如果找到,它将返回找到的 B
对象。
相关问题
query1 := a.Ts.Table("business_settlement_profit as a"). Select(`ifnull(sum(CASE WHEN b.asid=a.link_id and a.user_type=? then b.sum_order_amt else 0 end),0) as sum_pay_amt, ifnull(sum(CASE WHEN b.asid=a.link_id and a.user_type=? then 1 else 0 end),0) as order_sum, ifnull(sum(CASE WHEN a.stmt_status=1 THEN a.profit ELSE 0 END), 0.00) as sum_profit, ifnull(sum(CASE WHEN a.stmt_status=0 and b.asid=a.link_id and a.user_type=? THEN a.pay_amt+b.sum_order_amt ELSE 0 END), 0.00) as ret_pay_amt`, model.USER_TYPE_SUPPLIER_AGENT, model.USER_TYPE_SUPPLIER_AGENT, model.USER_TYPE_SUPPLIER_AGENT). Joins("inner join business_settlement as b on a.bsid=b.bsid"). Where("a.link_id=? and a.user_type=?", a.Token.LinkId, a.Token.UserType)
这段代码是一个查询语句,使用了GORM库的链式调用方法。它从名为business_settlement_profit
的表中选择了一些字段,并根据特定条件进行了一些计算。以下是对代码的解释:
query1 := a.Ts.Table("business_settlement_profit as a").
Select(`ifnull(sum(CASE WHEN b.asid=a.link_id and a.user_type=? then b.sum_order_amt else 0 end),0) as sum_pay_amt,
ifnull(sum(CASE WHEN b.asid=a.link_id and a.user_type=? then 1 else 0 end),0) as order_sum,
ifnull(sum(CASE WHEN a.stmt_status=1 THEN a.profit ELSE 0 END), 0.00) as sum_profit,
ifnull(sum(CASE WHEN a.stmt_status=0 and b.asid=a.link_id and a.user_type=? THEN a.pay_amt+b.sum_order_amt ELSE 0 END), 0.00) as ret_pay_amt`,
model.USER_TYPE_SUPPLIER_AGENT, model.USER_TYPE_SUPPLIER_AGENT, model.USER_TYPE_SUPPLIER_AGENT).
Joins("inner join business_settlement as b on a.bsid=b.bsid").
Where("a.link_id=? and a.user_type=?", a.Token.LinkId, a.Token.UserType)
在这段代码中,query1
是一个GORM库的查询构造器对象。它使用了链式调用的方式来构建一个复杂的查询语句。下面是对每一部分的解释:
a.Ts.Table("business_settlement_profit as a")
:从名为business_settlement_profit
的表中选择数据,并将其别名为a
。Select(...)
:选择了一些字段,并使用SUM
和CASE WHEN
等表达式进行计算。这些计算结果将被赋予别名,如sum_pay_amt
、order_sum
等。Joins("inner join business_settlement as b on a.bsid=b.bsid")
:使用内连接将business_settlement_profit
表与business_settlement
表进行关联,关联条件是它们的bsid
字段相等。Where("a.link_id=? and a.user_type=?", a.Token.LinkId, a.Token.UserType)
:设置查询的条件,即link_id
等于a.Token.LinkId
并且user_type
等于a.Token.UserType
。
根据你的需求,你可以根据这个示例进行修改和扩展来构建你自己的查询语句。
gorm 根据父id查询出所有的子id
如果你使用的是 GORM v1,你可以使用 Preload
方法来预加载子元素,并使用 Where
方法来筛选父元素。以下是示例代码:
type Category struct {
ID uint
ParentID uint
Children []Category `gorm:"foreignkey:ParentID"`
}
func FindChildren(db *gorm.DB, parentID uint) ([]Category, error) {
var categories []Category
err := db.Preload("Children").Where("parent_id = ?", parentID).Find(&categories).Error
if err != nil {
return nil, err
}
return categories, nil
}
如果你使用的是 GORM v2,你可以使用 Preload
方法来预加载子元素,并使用 Where
方法来筛选父元素。以下是示例代码:
type Category struct {
ID uint
ParentID uint
Children []Category `gorm:"foreignKey:ParentID"`
}
func FindChildren(db *gorm.DB, parentID uint) ([]Category, error) {
var categories []Category
err := db.Preload("Children").Where("parent_id = ?", parentID).Find(&categories).Error
if err != nil {
return nil, err
}
return categories, nil
}
请注意,这里使用了 foreignKey
标签来指定外键的名称,因为 GORM 默认使用 CategoryID
作为外键的名称,而不是 ParentID
。
相关推荐
















