如何使用 GORM 过滤 table 与其他 table 中多对多关系相关的实体?

How to filter table with entity from other tables related by many to many relationship using GORM?

我有产品 table,它使用多对多关系与其他两个 table 的类别和属性值相连。我正在使用 GORM 作为 ORM。去构造那些 table 如下所示。

type Product struct {
    ProductID               int                  `gorm:"column:product_id;primary_key" json:"product_id"`
    Name                    string               `gorm:"column:name" json:"name"`
    Categories              []Category           `gorm:"many2many:product_category;foreignkey:product_id;association_foreignkey:category_id;association_jointable_foreignkey:category_id;jointable_foreignkey:product_id;"`
    AttributeValues         []AttributeValue     `gorm:"many2many:product_attribute;foreignkey:product_id;association_foreignkey:attribute_value_id;association_jointable_foreignkey:attribute_value_id;jointable_foreignkey:product_id;"`
}


type Category struct {
    CategoryID   int         `gorm:"column:category_id;primary_key" json:"category_id"`
    Name         string      `gorm:"column:name" json:"name"`
    Products     []Product   `gorm:"many2many:product_category;foreignkey:category_id;association_foreignkey:product_id;association_jointable_foreignkey:product_id;jointable_foreignkey:category_id;"`
}


type AttributeValue struct {
    AttributeValueID int    `gorm:"column:attribute_value_id;primary_key" json:"attribute_value_id"`
    AttributeID      int    `gorm:"column:attribute_id" json:"attribute_id"`
    Value            string `gorm:"column:value" json:"value"`
    Products     []Product   `gorm:"many2many:product_attribute;foreignkey:attribute_value_id;association_foreignkey:product_id;association_jointable_foreignkey:product_id;jointable_foreignkey:attribute_value_id;"`
}

如果我想按类别查询产品 table,我可以像下面那样进行操作,这将 return 属于 category_id 的类别中的所有产品 3.

cat := model.Category{}
s.db.First(&cat, "category_id = ?", 3)
products := []*model.Product{}
s.db.Model(&cat).Related(&products, "Products")

如果我想通过类别和属性值查询产品 table,我该怎么做?假设我想找到属于 category_id 3 类别且具有 attribute_value_id 2?

属性值的所有产品

我找到了一些基于类别和属性值查询产品的方法。我得到的最好方法就像下面这样

    products := []*model.Product{}

    s.db.Joins("INNER JOIN product_attribute ON product_attribute.product_id = " +
                    "product.product_id AND product_attribute.attribute_value_id in (?)", 2).
    Joins("INNER JOIN product_category ON product_category.product_id = " +
                    "product.product_id AND product_category.category_id in (?)", 3).
    Find(&products)

执行此操作后,产品切片将填充 category_id 3 类别中的所有产品,并具有 attribute_value_id 2 的 AttributeValue。如果需要,我们可以传递字符串切片在多个类别和属性值中查找产品。