前言
一、GROM多表關聯
適用于返回全部數據 需要邏輯外鍵(不會在數據庫創建任何約束) 適合三個表以下的關聯 有幾張表就會查詢幾次
type Product struct { gorm. Model CateID uint `gorm:"not null;index:idx_cate_id" json:"cate_id"` TagID string `gorm:"size:255;not null;index:idx_tag_id" json:"tag_id"` Name string `gorm:"size:255;not null;uniqueIndex:idx_name" json:"name"` Sku string `gorm:"size:50;not null;uniqueIndex:idx_sku" json:"sku"` Price float64 `gorm:"type:decimal(10,2);not null;default:0.00" json:"price"` Stock int `gorm:"not null;default:0" json:"stock"` StockWarning int `gorm:"not null;default:0" json:"stock_warning"` CostPrice float64 `gorm:"type:decimal(10,2);not null;default:0.00;" json:"cost_price"` Status int8 `gorm:"type:tinyint;not null;default:1;index:idx_status" json:"status"` Description * string `gorm:"type:text" json:"description"` ImageUrl * string `gorm:"size:255" json:"image_url"` Unit string `gorm:"size:255;not null" json:"unit"` Category OrderCate `gorm:"foreignKey:CateID" json:"category"`
}
func GetProduvtWithCategroy ( id uint ) ( * Product , error ) { var product Productresult := DB. Preload ( "Category" ) . Where ( "id = ?" , id) . First ( & product) return & product, result. Error
}
二、原生Sql多表關聯
適用于三個表以上關聯 只查詢一次 適用于返回精準字段
type ProductListResult struct { ID uint `json:"id"` Name string `json:"name"` Price float64 `json:"price"` Stock int `json:"stock"` Status int8 `json:"status"` CateID uint `json:"cate_id"` CategoryName string `json:"category_name"` ImageUrl * string `json:"image_url"`
}
func GetProductListWithCategory ( ) ( [ ] ProductListResult, error ) { var results [ ] ProductListResultsql := `SELECTp.id,p.name,p.price,p.stock,p.status,p.cate_id,COALESCE(c.name, '未分類') as category_name,p.image_urlFROM products pLEFT JOIN products_cate c ON p.cate_id = c.idWHERE p.deleted_at IS NULLORDER BY p.created_at DESC` err := DB. Raw ( sql) . Scan ( & results) . Errorreturn results, err
}