Maison > Article > développement back-end > GORM renvoie une liste de résultats ou un graphique de résultats regroupés par identifiant
L'éditeur PHP Xinyi vous présente aujourd'hui une fonction importante de GORM, qui consiste à renvoyer une liste de résultats ou un graphique de résultats regroupés par identifiant. GORM est une puissante bibliothèque d'accès aux bases de données qui fournit des méthodes riches pour interroger et exploiter des bases de données. En utilisant GORM, nous pouvons facilement obtenir une liste de résultats de la base de données et également les regrouper par identifiant et renvoyer un graphique des résultats. Cette fonction est très pratique dans le développement réel et peut nous aider à traiter plus facilement les résultats des requêtes de base de données. Ensuite, apprenons comment utiliser GORM pour implémenter cette fonction !
Essentiellement, en utilisant gormdb, mon code actuel ressemble à ceci :
res = []*modelExample DB.Model(&modelExample{}). Order("task_id "). Find(res)
Ce que j'ai fait avec res, c'est que je bouclerais et ajouterais manuellement les modèles avec le même task_id à une liste, puis j'ajouterais cette liste pour qu'elle soit traitée. La raison pour laquelle je dois faire cela est que je dois effectuer certaines opérations spécifiques sur des colonnes spécifiques que je dois extraire et que ces opérations ne peuvent pas être effectuées dans gorm.
Cependant, existe-t-il un moyen de faire cela plus efficacement, me permettant de revenir comme une liste de listes, puis de pouvoir effectuer une boucle et effectuer l'opération sur chaque élément de la liste ?
Vous devriez pouvoir utiliser l'extrait de code suivant pour répondre à vos besoins :
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) } }
Après avoir terminé la configuration initiale, examinons de plus près la section requête.
Tout d’abord, vous obtiendrez tous les enregistrements de la table. L'enregistrement que vous obtenez est stocké dans la variable rows
.
en for
循环中,您扫描所有记录。每条记录都将添加为新的地图条目或附加到现有条目(如果 taskid
existe déjà dans la carte).
C'est le moyen le plus simple de créer différentes listes basées sur des colonnes spécifiques (comme taskid
)。实际上,根据我的理解,您需要拆分记录,而不是使用聚合函数将它们分组(例如 count
、sum
etc.).
L'autre code que j'ai ajouté est juste pour plus de clarté.
Si cela résout votre problème ou si vous avez besoin d'autre chose, faites-le-moi savoir, merci !
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!