当前位置: 首页 > 知识库问答 >
问题:

如何在GORM中联接两个表

公羊光明
2023-03-14

我有两张桌子,

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;

我想为changelog实现一个搜索方法,该方法返回字段

"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中提到的表格中获得我提到的内容?

共有1个答案

陈坚
2023-03-14

一种方法是将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对象,对象的结构将不会是平面的,因为您将有一个注释字段。

 类似资料:
  • 问题内容: 我有两个必须分开的索引: 我将如何在搜索中“联接”这两个表,以使其返回以下内容: 问题答案: 正如您在其他问题中回答的那样,没有什么可以阻止您在建立索引时将名称存储在每个文档中,同时仍然具有包含数据的专用索引。请记住,这都是关于巧妙地对数据进行规范化,以便每个文档都可以根据需要实现“自包含”。 该解决方案的优点是每个订单商品都是完全独立的,您可以对其进行分组/汇总以获取给定订单的所有商

  • 问题内容: 我有两个表: 服务 ID 客户 服务 和 客户 ID 名称 电子邮件 如何列出表服务并将客户表的客户名称汇总在一起?该表中的现场客户服务在客户表上具有该客户的ID, 我感谢您的帮助 问题答案:

  • 问题内容: 我有两个表和字段。我想同时参加这两个领域。我试过了 可以,但是非常慢。有一个更好的方法吗? 问题答案:

  • 问题内容: 我开始将DataTables Table插件用于jQuery ,但遇到了一些问题。我从这里使用示例代码。 我有MySQL表女巫看起来像这样: id | 名称| Father_id 是同一表中仅在不同行中的值。因此,如果我想知道父亲的名字,我必须在同一个表中进行搜索。但是DataTable所做的只是按原样显示MySQL表的内容。 在我的数据表中,我想显示如下数据: id | 名称| 父亲

  • 问题内容: 我有两个表: 我想从表1中选择所有具有值A和B的表2行的行。这将是行1和3(不是2行,因为它只有A,没有4行是因为只有B)。我可以在没有子查询的情况下执行此操作吗? (注意:我还需要查询表1中的值,因此我不能只查询表2。) 问题答案: 塔达阿!没有子查询。

  • 问题内容: 我有两个表,和。 在表中我有一列。该列由电影适合的类别组成。这些类别是用逗号分隔的ID。 这是一个例子: 现在是一个实际的问题:是否可以执行一个查询,从电影表中排除类别列,而是从类别表中选择匹配的类别并以数组形式返回它们?像联接一样,但问题是存在多个用逗号分隔的类别,是否可以进行某种正则表达式? 问题答案: 在数据库字段中使用逗号分隔的列表是一种反模式,应不惜一切代价避免使用。 因为在