使用gorm可以通过联结表查询的方式,同时拉取订单记录和每条订单的总价。下面是一个示例代码:
package main
import (
"fmt"
"gorm.io/driver/mysql"
"gorm.io/gorm"
"log"
)
type Goods struct {
ID int
Order string
Name string
Price float64
Num int
}
type Order struct {
ID int
Order string
ProjectName string
TotalPrice float64
}
func main() {
// 连接数据库
dsn := "username:password@tcp(127.0.0.1:3306)/database?charset=utf8mb4&parseTime=True&loc=Local"
db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})
if err != nil {
log.Fatal(err)
}
// 查询订单表,并计算每个订单的总价
var orders []Order
err = db.Table("orders").
Select("orders.*, SUM(goods.price * goods.num) AS total_price").
Joins("LEFT JOIN goods ON orders.order = goods.order").
Group("orders.order").
Find(&orders).Error
if err != nil {
log.Fatal(err)
}
// 输出订单记录和总价
for _, o := range orders {
fmt.Println("订单:", o.Order)
fmt.Println("项目名:", o.ProjectName)
fmt.Println("总价:", o.TotalPrice)
fmt.Println()
}
}
在上述代码中,我们使用gorm的Table、Select、Joins和Group方法进行联结表查询。首先,我们指定查询的表为"orders",并使用Select方法选择了所有的订单字段以及计算每个订单的总价(使用SUM函数和乘法运算符)。然后,使用Joins方法指定了"orders.order"和"goods.order"之间的联结关系,通过LEFT JOIN将两个表关联起来。最后,使用Group方法按订单进行分组。
最后,我们使用Find方法将查询结果保存到orders切片中,并遍历输出每个订单的记录和总价。