Maison  >  Article  >  développement back-end  >  Comment obtenir les noms et valeurs des colonnes de l'objet Gorm ?

Comment obtenir les noms et valeurs des colonnes de l'objet Gorm ?

WBOY
WBOYavant
2024-02-09 15:30:091182parcourir

如何从 Gorm 对象获取列名称和值?

php Editor Strawberry Dans le développement de la programmation, nous utilisons souvent des objets Gorm pour les opérations de base de données. Parfois, nous devons obtenir le nom de la colonne et la valeur correspondante à partir de l'objet Gorm. Alors, comment répondre à cette exigence ? Dans Gorm, nous pouvons obtenir les propriétés et les valeurs de l'objet par réflexion, et les combiner avec les étiquettes de Gorm pour obtenir les noms de colonnes. Ensuite, je présenterai en détail comment obtenir les noms et les valeurs des colonnes à partir des objets Gorm. Nous allons jeter un coup d'oeil!

Contenu de la question

Je souhaite écrire une fonction qui peut prendre n'importe quel objet chargé depuis la base de données (via gorm) et imprimer tous les noms et valeurs de colonnes. Évidemment, l'élément clé est la possibilité de transmettre n'importe lequel de mes modèles Gorm dans cette fonction. Je ne les montre pas ci-dessous car ils sont tous simples.

Ce que j'ai jusqu'à présent, c'est une fonction avec une interface et un code de test qui l'appelle :

func testfunc(s interface{}) {

    // type
    v := reflect.TypeOf(s)

    fmt.Println(v)

    // fields?
    for i := 0; i < v.NumField(); i++ {
        fmt.Println(i)
    }
}
trans := make([]orm.Trans, 0)

    db.Where("state = ?", state.FINISHED).Limit(1).Find(&trans)

    testfunc(trans)

Lors de l'exécution, le type s'imprime puis panique :

[]orm.Trans
panic: reflect: call of reflect.Value.NumField on slice Value

Je suis un débutant, donc vos idées sont les bienvenues. Il semble que mes choix possibles soient :

  • Utilisez la réflexion (le cas échéant pour le découpage)
  • Trouver un champ dans un modèle d'une manière ou d'une autre ?
  • D'autres idées ?

Merci.

Solution

Essayez cette méthode :

func testfunc(x interface{}){
        v := reflect.ValueOf(x)
        s := reflect.TypeOf(x)
        names:=make([]interface{},v.NumField())
        values := make([]interface{}, v.NumField())

        for i := 0; i < v.NumField(); i++ {
                values[i] = v.Field(i).Interface()
                names[i] = s.Field(i).Name
        }
        fmt.Println("Names",names)
        fmt.Println("values",values)

}

1- Vous passez une tranche de structure. (Si vous utilisez le découpage, évitez d'appeler la fonction ci-dessus en boucle.)

2- Je passe cette structure à la fonction ci-dessus

x := struct {
                Name string
                Id int
        }{"Zargham", 2}

3-Obtenir le résultat :-

Names [Name Id]
values [Zargham 2]

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