Saya menggunakan golang 1.19 dan ORM sebagai GORM. Saya perlu mendapatkan semula produk menggunakan ID kategori. Jadual produk dan jadual kategori terikat kepada perhubungan banyak-ke-banyak. Jadi jadual ketiga ialah product_categories.
Apa yang perlu saya lakukan ialah apabila permintaan dapatkan disertakan dengan id kategori, saya perlu mendapatkan semula produk dengan id kategori tersebut.
Lihat struktur model di bawah,
// 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:"-"` }
Saya menggunakan kaedah alternatif untuk mencapai ini. Ia berfungsi dengan baik, tetapi saya fikir ia bukan pendekatan terbaik apabila ia melibatkan banyak-ke-banyak. Saya ambil semula ProductCategory
然后循环它并获取 product id
然后将其添加到切片中,然后使用这些产品 id 检索 products
dahulu.
Lihat kod saya di bawah,
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 }
Apakah cara terbaik untuk mendapatkan produk yang sesuai untuk senario saya menggunakan hubungan banyak-ke-banyak GORM?
Saya tidak dapat mengesahkan kerana saya tidak mempunyai persediaan untuk ini, tetapi berdasarkan https://gorm.io/docs/many_to_many.html dan idea pramuat, anda sepatutnya boleh mencipta entiti kategori dengan ID yang diingini dan kemudian pramuat Muatkan produk pada kategori ini, contohnya: