根据外键关系获取GORM模型行(golang)
Get GORM model row based on foreign key relationship (golang)
我正在使用 Golang (GORM) + Postgres。我正在尝试对卖家向买家销售商品的业务情况建模,每个买家都创建一个订单交易。
我有一个 Order Gorm 模型,还有一个 Buyer 和一个 Seller Gorm 模型。买方和卖方已经在数据库中创建了行。
一个买家有很多订单。
一个卖家有很多订单。
为了绘制出这种关系,我相信我只是创建了各自的 Buyer/Seller 结构(标准 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 ...
}
我假设以上自动创建关系,但我不完全确定。我可以用这个函数创建一个订单,这个 returns 很好:
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 table,请在您的订单结构中包含两个字段,您也可以使用 foreignKey
标签来填充这些字段字段(默认情况下,它们填充有关联的 table 记录的主要 ID,您可以使用 references
标记 here 来更改它)。
type Order struct {
ID int64 `json:"id" gorm:"primaryKey;autoIncrement: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:"primaryKey;autoIncrement:true"`
Name string `json:"name"`
}
type Seller struct {
ID int64 `json:"id" gorm:"primaryKey;autoIncrement: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
table 的索引要求。
对大型查询使用简单的原始查询构建器
https://perfilovstanislav.github.io/go-raw-postgresql-builder/#simple-example
我正在使用 Golang (GORM) + Postgres。我正在尝试对卖家向买家销售商品的业务情况建模,每个买家都创建一个订单交易。
我有一个 Order Gorm 模型,还有一个 Buyer 和一个 Seller Gorm 模型。买方和卖方已经在数据库中创建了行。
一个买家有很多订单。
一个卖家有很多订单。
为了绘制出这种关系,我相信我只是创建了各自的 Buyer/Seller 结构(标准 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 ...
}
我假设以上自动创建关系,但我不完全确定。我可以用这个函数创建一个订单,这个 returns 很好:
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 table,请在您的订单结构中包含两个字段,您也可以使用 foreignKey
标签来填充这些字段字段(默认情况下,它们填充有关联的 table 记录的主要 ID,您可以使用 references
标记 here 来更改它)。
type Order struct {
ID int64 `json:"id" gorm:"primaryKey;autoIncrement: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:"primaryKey;autoIncrement:true"`
Name string `json:"name"`
}
type Seller struct {
ID int64 `json:"id" gorm:"primaryKey;autoIncrement: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
table 的索引要求。
对大型查询使用简单的原始查询构建器 https://perfilovstanislav.github.io/go-raw-postgresql-builder/#simple-example