我有两个表,
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中从提到的表中得到我提到的内容?
一种方法是结合Joins
和Select
方法来获得您想要的。根据您的表,它看起来像这样:
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
字段以及。