我有一个函数需要返回嵌套在 JSON 中的许多对象,我在本例中将其简化为 3 个,希望能更容易解释。
我有 3 个看起来像这样的模型
type Item1 struct {
tableName struct{} `pg:"item_1"`
Id string `pg:"id,pk"`
Data string `pg:"data"`
Data2 string `pg:"data2"`
Item2 []*Item2 `pg:"rel:has-many"`
Item3 []*Item3 `pg:"rel:has-many,join_fk:data2"`
}
type Item2 struct {
tableName struct{} `pg:"item_2"`
Id string `pg:"id"`
Data string `pg:"data"`
Name string `pg:"name"`
}
type Item3 struct {
tableName struct{} `pg:"item_3"`
Id string `pg:"id"`
Place string `pg:"place" `
Data2 string `pg:"data2"`
}
我需要使用'Id'来查询Item1和Item2,但我需要使用从Item1返回的'Data2'的值来查询Item3。 Go-pg 使第一部分变得非常简单,因为我可以做
var item Item1
err := db.DB.Model(&item).
Relation("Item2").
Where("id = ?", id).Select()
当我尝试添加任何不使用“Id”的关系时,明显的问题出现了,即使我将“join_fk:data2”附加到了 Item1 模型,但我尝试过的所有内容都继续尝试通过使用来查询它'ID'。我对我的 SQL 非常非常生疏,但我认为我需要在某个地方有一个子查询?我需要一种能够查询 n 个关系的通用方法,但并非所有关系都使用相同的输入参数,而是在开始时查询的参数将使我的 JSON 输出格式如下:
{"Item1":{
"id":"",
"data":"",
"data2":"",
"Item2":[
..
..
],
"Item3":[
..
..
] }
Query Item1 by input.id ->
(Query Relation 1 by input.id)->
(Query Relation 2 by input.id)->
(Query Relation 3 by Item1.data2)->
(Query Relation 4 by Item1.data2)
尝试这样的事情也行不通
err := db.DB.Model(&item).
Relation("Item2").
Relation("Item3", func(q *orm.Query) (*orm.Query, error) {
return q.Where("data2 = ?", item.data2), nil
}).
Where("id = ?", id).Select()
这将返回除 Item3 之外的所有内容,因为它使用 AND 将 WHERE 子句添加到 Item3 查询中。
Query created by go-pg -> SELECT "item3"."id", "item3"."data2" FROM "v_item_3" AS "item3" WHERE (data2 = 'Item1.Data2') AND ("item3"."id" IN ('INPUT PARAM'))
出于某种原因,这会尝试返回整个 Item1 表...
err := db.DB.Model(&item).
Relation("item2", func(q *orm.Query) (*orm.Query, error) {
return q.Where("id = '526467'"), nil
}).
Relation("item3", func(q *orm.Query) (*orm.Query, error) {
return q.Where("data2 = '32494'"), nil
}).Select()