Maison >développement back-end >Golang >Implémentation de relations avec des tableaux de valeurs dans Gorm

Implémentation de relations avec des tableaux de valeurs dans Gorm

WBOY
WBOYavant
2024-02-09 08:48:09717parcourir

在 Gorm 中实现与值数组的关系

Implémenter des relations avec des tableaux de valeurs est une fonctionnalité très utile dans Gorm. Gorm est une bibliothèque ORM (Object Relational Mapping) populaire du langage Go qui permet aux développeurs d'utiliser le langage Go pour faire fonctionner des bases de données. Contrairement aux bases de données relationnelles traditionnelles, un tableau de valeurs est une structure de données spéciale qui permet de stocker plusieurs valeurs dans leur ensemble dans un champ de la base de données. Ceci est très utile pour stocker certaines structures de données complexes ou améliorer l'efficacité des requêtes. Dans cet article, je vais vous présenter comment implémenter des relations avec des tableaux de valeurs dans Gorm et comment les utiliser pour améliorer l'efficacité du développement.

Contenu de la question

J'essaie d'implémenter un modèle pour une application de facturation utilisant Go et Gorm. J'ai défini une structure de facture et je souhaite inclure des éléments de ligne de facture provenant d'une structure distincte.

type invoice struct {
    base
    companyid  string `gorm:"not null"`
    company    company
    invoiceno  string     `gorm:"not null"`
    currency   string     `gorm:"not null;default:'gbp'"`
    total      float64    `gorm:"not null"`
    terms      int        `gorm:"not null;default:30"`
    issueddate time.time  `gorm:"not null"`
    duedate    time.time  `gorm:"not null"`
    paid       bool       `gorm:"not null"`
    lineitems  []lineitem `gorm:"foreignkey:invoiceid"`
    void       bool       `gorm:"default:false"`
}

Voici ma structure d'éléments de ligne.

type lineitem struct {
    base
    service     string `gorm:"not null"`
    description string `gorm:"not null;"`
    amount      float64
    count       int
    unitbase    string  `gorm:"not null;default:'days'"` // days or hours
    total       float64 `gorm:"not null"`
}

Lorsque j'essaie de créer l'application, j'obtiens l'erreur suivante.

... got error invalid field found for struct github.com/repo/API/database/models.Invoice's field LineItems: define a valid foreign key for relations or implement the Valuer/Scanner interface

L'idée est que je peux définir un élément de campagne limité qui peut choisir parmi un tarif fixe et une description pour limiter la duplication.

Je ne suis pas sûr de m'y prendre de la bonne manière.

Ma question est donc la suivante : est-il possible d'inclure un tableau d'éléments dans un modèle relationnel de cette façon ?

Solution de contournement

En fonction des noms de vos colonnes, je peux penser à trois façons d'y parvenir :

  1. Utiliser la syntaxe par défaut (sans gorm:foreignkey)

    type invoice struct {
         id     //this is the primary key, may also be in your base model
         lineitems []lineitem
         ..other fields
     }
    
     type lineitem struct {
         id          //primary key of lineitem
         invoiceid   //automatically this will be your foreign key
         ..other fields
     }
  2. Spécifiez une clé étrangère personnalisée (en supposant que la deuxième structure ait un nom de colonne différent que vous souhaitez utiliser comme clé étrangère)

    type invoice struct {
         id     //this is the primary key, may also be in your base model
         lineitems []lineitem `gorm:"foreignkey:parentid"`
         ..other fields
     }
    
     type lineitem struct {
         id          //primary key of lineitem
         parentid   //this is the custom column referencing invoice.id
         ..other fields
     }
  3. Ou les deux structures ont des noms de colonnes différents

    type Invoice struct {
         ID     //this is the primary key, may also be in your base model
         InvoiceNum 
         Lineitems []LineItem `gorm:"foreignKey:ParentNum;references:InvoiceNum"`
         ..other fields
     }
    
     type LineItem struct {
         ID          //primary key of LineItem
         ParentNum   //this is now referencing Invoice.InvoiceNum
         ..other fields
     }

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
Article précédent:Rendu .gif dans GoArticle suivant:Rendu .gif dans Go