使用第一个返回值查询后续关系

时间:2021-02-13 01:21:13

标签: postgresql go go-pg

我有一个函数需要返回嵌套在 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()

0 个答案:

没有答案
相关问题