我有一个表与golang结构像这样:
Order {
ID
TransactionID
Transaction
}
Transaction {
ID
ProfileID
Profile
}
Profile {
ID
AccountID
Account
}
如何获得所有的订单与条件的帐户id与gorm?我试过了:
var orders []*Order
res := r.db.
Joins("Transaction").
Preload("Transaction.Profile").
Where("Transaction.Profile.account_id = 1").
Find(&orders)
但它不工作。
这个解决方案应该基于您提供的结构定义。首先,让我展示代码,然后我将逐一执行每一步:
package main
import (
"fmt"
_ "github.com/lib/pq"
"gorm.io/driver/postgres"
"gorm.io/gorm"
)
type Order struct {
Id int
TransactionId int
Transaction Transaction
}
type Transaction struct {
Id int
ProfileId int
Profile Profile
}
type Profile struct {
Id int
AccountId int
Account Account
}
type Account struct {
Id int
}
func main() {
dsn := "host=localhost user=postgres password=postgres dbname=postgres port=5432 sslmode=disable"
db, err := gorm.Open(postgres.Open(dsn), &gorm.Config{})
if err != nil {
panic(err)
}
db.AutoMigrate(&Account{})
db.AutoMigrate(&Profile{})
db.AutoMigrate(&Transaction{})
db.AutoMigrate(&Order{})
db.Create(&Account{})
db.Create(&Profile{AccountId: 1})
db.Create(&Transaction{ProfileId: 1})
db.Create(&Order{TransactionId: 1})
// order + transaction + profile + account
var order Order
db.Debug().Preload("Transaction.Profile.Account").Joins("inner join transactions t on orders.transaction_id = t.id").Joins("inner join profiles p on p.id = t.profile_id").Joins("inner join accounts a on p.account_id = a.id").First(&order, "a.id = ?", 1)
fmt.Println(order)
}
让我们仔细看看代码。
结构体定义这里没有任何变化。当你声明结构的时候,一定要知道GORM的约定,因为GORM将在此基础上创建关系、外键和约束。
准备数据库
在这里,您可以找到到Postgres的连接,同步表的自动迁移命令,以及一些虚拟数据的插入。
查询在这里,我们使用了Go的GORM包提供的许多方法。让我们用一个简短的列表来概括它们:
Debug
:它将Raw SQL查询打印到控制台。在处理复杂查询 时非常有用。Preload
:加载相关实体,但在Gorm 生成的最终查询中不包含它们Joins
:它指定在JOIN子句中必须引用哪些表。对于Joins
,我们将子句添加到查询中。First
:它既用于只获取一条记录,也用于指定一些过滤器,如在我们的情况下(例如a.id = ?
)。
让我知道这是否澄清了你的问题,谢谢!