Maison > Questions et réponses > le corps du texte
J'utilise Golang 1.19 et ORM comme GORM. Je dois récupérer un produit en utilisant l'ID de catégorie. La table des produits et la table des catégories sont liées à une relation plusieurs-à-plusieurs. Le troisième tableau est donc product_categories.
Ce que je dois faire, c'est lorsqu'une demande d'obtention est accompagnée d'un identifiant de catégorie, je dois récupérer le produit avec cet identifiant de catégorie.
Découvrez la structure du modèle ci-dessous,
// Product model // Categories many2many:product_categories type Product struct { ID uint `gorm:"primarykey" json:"id"` Slug string `gorm:"unique;size:255;" json:"slug"` Title string `gorm:"size:255;not null" json:"title"` Code string `gorm:"size:255;not null" json:"code"` BrandID uint `json:"-"` Brand Brand `json:"brand"` ShortDescription string `gorm:"not null" json:"short_description"` Description string `json:"description"` Price uint `gorm:"not null" json:"price"` Quantity uint `json:"qnt"` DiscountPrice uint `json:"discount_price"` Categories []Category `gorm:"many2many:product_categories;" json:"categories"` Attributes []Attribute `json:"attributes"` ProductImages []ProductImage `json:"product_images"` CreatedAt time.Time `json:"-"` UpdatedAt time.Time `json:"-"` }
// Category model // Products many2many:product_categories type Category struct { ID uint `gorm:"primarykey" json:"id"` Name string `gorm:"size:255;not null" json:"name"` Icon string `gorm:"size:255;not null" json:"icon"` Image string `gorm:"size:255;not null" json:"image"` Weight int32 `gorm:"AUTO_INCREMENT" json:"weight"` Products []Product `gorm:"many2many:product_categories;" json:"products"` CreatedAt time.Time `json:"-"` UpdatedAt time.Time `json:"-"` }
// ProductCategory Model // This table auto generate with gorm type ProductCategory struct { CategoryID int `gorm:"primaryKey" json:"-"` ProductID uint `gorm:"primaryKey" json:"-"` }
J'utilise une méthode alternative pour y parvenir. Cela fonctionne bien, mais je pense que ce n'est pas la meilleure approche lorsqu'il s'agit de plusieurs à plusieurs. Je récupère ProductCategory
然后循环它并获取 product id
然后将其添加到切片中,然后使用这些产品 id 检索 products
en premier.
Voir mon code ci-dessous,
func (q *Queries) GetProductsbyCat(id uint) ([]models.Product, error) { // Define products variable and product_cat variable products := []models.Product{} product_cats := []models.ProductCategory{} // Retrieve product_cat and assigned to variable err := q.Model(&product_cats).Limit(10).Find(&product_cats, "category_id = ?", id).Error if err != nil { // Return empty object and error. return nil, err } // define products ids slice productIds := []int{} // loop product cats and append product id's to productids variable for _, v := range product_cats { productIds = append(productIds, int(v.ProductID)) } // Retrieve products err = q.Model(&products).Order("id desc").Preload("ProductImages").Find(&products, productIds).Error if err != nil { // Return empty object and error. return nil, err } return products, nil }
Quelle est la meilleure façon d'obtenir des produits adaptés à mon scénario en utilisant la relation plusieurs-à-plusieurs de GORM ?
P粉4468003292024-01-05 09:38:22
Je ne peux pas vérifier car je n'ai pas de configuration pour cela, mais sur la base de https://gorm.io/docs/many_to_many.html et de l'idée du préchargement, vous devriez pouvoir créer un entité de catégorie avec l'ID souhaité puis précharger Charger les produits sur cette catégorie, par exemple :
category := models.Category{ID: id} err := q.Model(&Category{}).Preload("Products").Find(&category)