Maison >développement back-end >Golang >GORM renvoie une liste de résultats ou un graphique de résultats regroupés par identifiant

GORM renvoie une liste de résultats ou un graphique de résultats regroupés par identifiant

王林
王林avant
2024-02-12 11:54:081214parcourir

GORM 返回结果列表或按 id 分组的结果图

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 !

Contenu de la question

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 ?

Solution de contournement

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)。实际上,根据我的理解,您需要拆分记录,而不是使用聚合函数将它们分组(例如 countsum 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!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer