根据外键关系获取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