gpt4 book ai didi

Gorm 从具有嵌套表条件的表中获取所有数据

转载 作者:行者123 更新时间:2023-12-05 05:29:55 28 4
gpt4 key购买 nike

我有一个像这样的 golang 结构的表:

Order {
ID
TransactionID
Transaction
}

Transaction {
ID
ProfileID
Profile
}

Profile {
ID
AccountID
Account
}

如何用gorm获取所有带有account id条件的订单?我试过这个:

 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:它将原始 SQL 查询打印到控制台。在处理复杂查询时很有用
  • Preload:加载相关实体,但不将它们包含在 Gorm 生成的最终查询中
  • Joins:它指定必须在 JOIN 子句中引用哪些表。通过 Joins,我们将子句添加到查询中。
  • First:它既用于仅获取一条记录,也用于指定一些过滤器,例如在我们的例子中(例如 a.id = ?)。

如果这能澄清您的问题,请告诉我,谢谢!

关于Gorm 从具有嵌套表条件的表中获取所有数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74808999/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com