如何在GORM中连接两个表



我有两个表,

SET search_path = public;

CREATE TABLE IF NOT EXISTS changelog
(
id          BIGINT NOT NULL PRIMARY KEY,
object_type TEXT,
object_id   BIGINT,
parent_type TEXT,
parent_id   BIGINT,
action      TEXT,
field       TEXT,
old_value   TEXT,
new_value   TEXT,
comment_id  INTEGER,
created_on  TIMESTAMP WITHOUT TIME ZONE,
created_by  BIGINT
);
CREATE TABLE IF NOT EXISTS changelog_comments
(
id         INTEGER NOT NULL PRIMARY KEY,
comment    TEXT,
created_on TIMESTAMP WITHOUT TIME ZONE,
created_by BIGINT
);
SET search_path = DEFAULT;

我想为更改日志实现一个搜索方法,它返回字段

"objectType"
"objectId"
"parentType"
"parentId"
"action"
"field"
"oldValue"
"newValue"
"comment"
"createdBy"
"createdOn"

可以看到,结果来自两个表的连接。

我找到了https://gorm.io/docs/preload.html,但说实话,我不明白我怎么才能达到我需要的。

我想下面的话可能会有帮助

type ChangelogResponseItem struct {
ObjectType string     `json:"objectType"`
ObjectID   uuid.UUID  `json:"objectId"`
ParentType string     `json:"parentType"`
ParentID   uuid.UUID  `json:"parentId"`
Action     string     `json:"action"`
Field      *string    `json:"field"`
OldValue   *string    `json:"oldValue"`
NewValue   *string    `json:"newValue"`
Comment    *string    `json:"comment"`
CreatedBy  *uint64    `json:"createdBy"`
CreatedOn  *time.Time `json:"createdOn"`
}

问题是如何在GORM中从提到的表中得到我提到的内容?

一种方法是结合JoinsSelect方法来获得您想要的。根据您的表,它看起来像这样:

list := []ChangelogResponseItem{}
tx := db.Table("changelog").
Joins("INNER JOIN changelog_comments cc ON cc.id = changelog.comment_id").
Select("changelog.objectType, changelog.object_type, changelog.object_id, changelog.parent_type, changelog.parent_id, changelog.action, changelog.field, changelog.old_value, changelog.new_value, cc.comment, changelog.created_on, changelog.created_by").
Find(&list)
if tx.Error != nil {
// handle error
}

这只是为了返回数据,搜索将包括额外的Where方法。

编辑:

带预加载选项的解决方案:

结构:

type ChangelogComment struct {
ID uint64 `json:"id"`
Comment string `json:"comment"`
}
type Changelog struct {
ObjectType string     `json:"objectType"`
ObjectID   uuid.UUID  `json:"objectId"`
ParentType string     `json:"parentType"`
ParentID   uuid.UUID  `json:"parentId"`
Action     string     `json:"action"`
Field      *string    `json:"field"`
OldValue   *string    `json:"oldValue"`
NewValue   *string    `json:"newValue"`
CommentID    uint64    `json:"comment_id"`
Comment    *ChangelogComment `json:"comment"` 
CreatedBy  *uint64    `json:"createdBy"`
CreatedOn  *time.Time `json:"createdOn"`
}

使用Preload方法的代码:

list := []Changelog{}
tx := db.Preload("Comment").Find(&list)
if tx.Error != nil {
// handle error
}

请注意,在这种情况下,您将有一个不同的JSON对象,对象的结构将不会是平面的,因为您将有一个comment字段以及。

相关内容

  • 没有找到相关文章

最新更新