php小編新一今天為大家介紹GORM的一個重要功能,即返回結果列表或按id進行分組的結果圖。GORM是一個強大的數據庫訪問庫,它提供了豐富的查詢和操作數據庫的方法。通過使用GORM,我們可以輕松地從數據庫中獲取結果列表,也可以按照id進行分組并返回結果圖。這個功能在實際開發中非常實用,能夠幫助我們更方便地處理數據庫查詢結果。接下來,讓我們一起來了解一下如何使用GORM來實現這個功能吧!
問題內容
本質上,使用 gormdb,我當前的代碼看起來像這樣:
res = []*modelExample
DB.Model(&modelExample{}).
Order("task_id ").
Find(res)
登錄后復制
我對 res 所做的事情是,我將手動循環并將具有相同 task_id 的模型附加到一個列表中,然后附加要處理的此列表。我需要這樣做的原因是因為我需要對特定列執行一些特定操作,我需要提取這些操作,而這些操作在 gorm 中無法執行。
但是,有沒有一種方法可以更有效地執行此操作,讓我像列表的列表一樣返回,然后我可以 for 循環并對每個列表元素執行操作?
解決方法
您應該能夠使用以下代碼片段來實現您的需求:
package main
import (
"fmt"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
type modelExample struct {
TaskId int
Name string
}
func main() {
dsn := "host=localhost user=postgres password=postgres dbname=postgres port=5432 sslmode=disable"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
db.AutoMigrate(&modelExample{})
// here you should populate the database with some data
// querying
res := make(map[int][]modelExample, 0)
rows, err := db.Table("model_examples").Select("task_id, name").Rows()
if err != nil {
panic(err)
}
defer rows.Close()
// scanning
for rows.Next() {
var taskId int
var name string
rows.Scan(&taskId, &name)
if _, isFound := res[taskId]; !isFound {
res[taskId] = []modelExample{{taskId, name}}
continue
}
res[taskId] = append(res[taskId], modelExample{taskId, name})
}
// always good idea to check for errors when scanning
if err = rows.Err(); err != nil {
panic(err)
}
for _, v := range res {
fmt.Println(v)
}
}
登錄后復制
完成初始設置后,讓我們仔細看看查詢部分。
首先,您將從表中獲取所有記錄。您獲取的記錄存儲在 rows 變量中。
在 for 循環中,您掃描所有記錄。每條記錄都將添加為新的地圖條目或附加到現有條目(如果 taskid 已存在于地圖中)。
這是根據特定列創建不同列表的最簡單方法(例如 taskid)。實際上,根據我的理解,您需要拆分記錄,而不是使用聚合函數將它們分組(例如 count、sum 等)。
我添加的其他代碼只是為了清楚起見而添加的。
如果這解決了您的問題或者您需要其他東西,請告訴我,謝謝!






