Maison >développement back-end >Golang >Implémentation de relations avec des tableaux de valeurs dans 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.
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 ?
En fonction des noms de vos colonnes, je peux penser à trois façons d'y parvenir :
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 }
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 }
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!