go-gorm - 在gorm golang上选择带有连接表的总和
问题描述
假设我有 3 个这样的模型
type Violation struct{
ID uint `gorm:"primaryKey"`
ViolationName string
ViolationPoint int
}
type Student struct{
ID uint `gorm:"primaryKey"`
StudentName string
}
type ViolationRecord struct{
ID uint `gorm:"primaryKey"`
ViolationID int
V Violation `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;foreignKey:ViolationID;references:ID"`
StudentID int
S Student `gorm:"constraint:OnUpdate:CASCADE,OnDelete:SET NULL;foreignKey:StudentID;references:ID"`
RecordDate time.Time
}
CRUD 系统一切都会好起来的,但新的请求是显示违规记录/学生的总数并总结违规点。
我试过这个
type ViolationSummary struct {
count int
sum int
}
func(s *Server) ShowSummary(id int){
var vs ViolationSummary
s.DB.Table("violation_records").
Select("count(violation_records.id) as count, sum(violations.violation_point) as sum").
Joins("left join violations on violation_records.violation_id=violations.id").Where("student_id = ?",id).Scan(&vs)
fmt.Println(vs.count)
fmt.Println(vs.sum)
}
但是这个函数总是显示 0 值
解决方案
我已经用这段代码解决了我的问题,我希望它可以提供帮助。
func(s *Server) ShowSummary(id int){
vr:= []models.ViolationRecord{}
var total int64 = 0
var point int64 = 0
err:= s.DB.Where("student_id = ?",id).Preload(clause.Associations).Find(&vr).Error
if err != nil {
fmt.println("Error on load data")
}
for _, element := range vr {
total += 1
point += int64(element.V.ViolationPoint)
}
fmt.println(total)
fmt.println(point)
}
推荐阅读
- java - Java 15 的密封类功能中的最终类和非密封类有什么区别?
- python - 将 python 模块导入 colab - ModuleNotFoundError
- python - 如何删除列表中的重复数字(Python)?
- python - 函数和随机化问题 - 初学者 python
- android - 如何在片段之间导航时消除白色闪烁/闪光?
- c++ - C++17 中条件启用的成员函数
- arrays - 如何从数组中的网页中提取所有 URL 并查看是否存在某个值
- excel - 如何找到通配符与VBA中至少一个字符匹配的文件夹名称
- javascript - 我应该做些什么来让它显示变量而不是值?
- laravel - 如何在点击时破坏 livewire 组件?