Maison  >  Questions et réponses  >  le corps du texte

Golang GORM implémente la récupération de données et la requête de table de jointure de relations plusieurs-à-plusieurs

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粉908138620P粉908138620289 Il y a quelques jours418

répondre à tous(1)je répondrai

  • P粉446800329

    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)

    répondre
    0
  • Annulerrépondre