[英]Get GORM model row based on foreign key relationship (golang)
我正在使用 Golang (GORM) + Postgres。 我正在尝试模拟一种业务情况,即卖方向买方出售商品,每个人都创建一个订单交易。
我有一个 Order Gorm 模型,以及一个买方和一个卖方 Gorm 模型。 买方和卖方已经是在数据库中创建的行。
一位买家有许多订单。
一位卖家有许多订单。
为了绘制出这种关系,我相信我只是创建了相应的买方/卖方结构(标准 Gorm 模型),然后像这样创建一个 Order 结构:
type Order struct {
ID int64 `json:"ID"gorm:"primary_key;auto_increment:true"`
Buyer *Buyer `json:"Buyer"`
Seller *Seller `json:"Seller"`
// ... other data ...
}
我假设上述自动创建关系,但我不完全确定。 我可以用这个函数创建一个订单,这返回正常:
func CreateOrder(buyer *entity.Buyer, seller *entity.Seller) (*entity.Order, error) {
order := &entity.Order{
User: buyer,
Sitter: seller,
// ... other data ...
}
db.Table("orders").Create(order)
return order
}
如果我转到 Postgres CLI,则TABLE orders;
不显示列买家或卖家。 我希望有一列他们的 ID。 所以这就是为什么我不确定这是否有效。 这本身肯定是一个问题。
无论如何,我真正想做的是能够检查买方/卖方当前是否存在任何订单。 但是我真的不认为用 gorm 查询来做到这一点。 我想在 SQL 中它会是这样的:
func FindOrder(buyer *entity.Buyer, seller *entity.Seller) {
db.Raw(`GET order FROM orders WHERE buyer = ?, seller = ?`, buyer, seller)
// OR this ???
db.Table("orders").First(buyer, buyer).First(seller, seller)
}
但我不知道实际执行此操作的任何 Gorm 辅助函数。 我也希望这样做是有效的,因为买家和卖家都有他们的 ID 主键。
如何根据买方/卖方找到订单,如上例所示?
作为替代方案,我正在考虑添加(买方 ID + 卖方 ID)来制作自定义订单 ID primary_key
。 不过,这似乎很棘手,因为我觉得关系的全部意义在于我不必做这样的事情。
如果您需要在订单表中查看卖家 ID 和买家 ID,请在您的订单结构中包含两个字段,您也可以使用外foreignKey
标签来填充这些字段(默认情况下,它们填充了订单的主 ID)关联的表记录,您可以使用这里提到的references
标记来更改它)。
type Order struct {
ID int64 `json:"id" gorm:"primary_key;auto_increment:true"`
BuyerID int64 `json:"buyer_id" gorm:"index"`
SellerID int64 `json:"seller_id" gorm:"index"`
Buyer *Buyer `json:"buyer" gorm:"foreignKey:BuyerID"`
Seller *Seller `json:"seller" gorm:"foreignKey:SellerID"`
}
type Buyer struct {
ID int64 `json:"id" gorm:"primary_key;auto_increment:true"`
Name string `json:"name"`
}
type Seller struct {
ID int64 `json:"id" gorm:"primary_key;auto_increment:true"`
Name string `json:"name"`
}
至于查找给定买家和卖家的订单的功能,您可以使用类似的东西,
func findOrders(db *gorm.DB, buyerID int,sellerID int)[]Order{
orders := make([]Order,0)
db.Where("buyer_id=? AND seller_id=?",buyerID,sellerID).Find(&Order{}).Scan(&orders)
return orders
}
相反,如果您需要查找给定买家或卖家的订单,
func findOrder(db *gorm.DB, buyerID int,sellerID int)[]Order{
orders := make([]Order,0)
db.Where("buyer_id=? OR seller_id=?",buyerID,sellerID).Find(&Order{}).Distinct().Scan(&orders)
return orders
}
index
标签涵盖了orders
表的索引要求。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.