如何将 MySQL 查询转换为 GORM 查询

How to convert MySQL query into GORM query

我有两个表:usersjobs 其中每个用户可以有多个工作,但一个特定的工作属于一个用户。

type Job struct {
    ID      uint   `gorm:"primarykey" json:"id"`
    Title   string `gorm:"type:varchar(255); not null" json:"title"`
    Content string `gorm:"not null" json:"content"`
    UserID  uint   `json:"-"`
}

type User struct {
    ID         uint      `gorm:"primarykey" json:"-"`
    UUID       uuid.UUID `gorm:"type:char(36) not null" json:"-"`
    Name       string    `gorm:"type:varchar(255); not null" json:"name"`
    Jobs       []Job     `json:"-"`
}

我想得到每个 post 的作者。

以下查询有效:

SELECT j.id, j.title, j.content, u.name AS author
FROM jobs AS j
INNER JOIN users AS u
ON j.user_id = u.id

在戈尔姆:

func (jobRepo repository) FindAll() []entity.Job {
    var jobs []entity.Job
    jobRepo.db.Find(&jobs)

    // how do we handle the rest?

    return jobs
}

我必须return以下JSON回复:

job_id: <random_id>
job_title: "Test Title Content",
job_content: "Test Job Content",
author: {
  name: "Test User Name"
}

如何获取每个 post 的作者数据?

查看您需要生成的 JSON 响应,您可以首先将 User 字段添加到 Job 结构,如下所示:

type Job struct {
    ID      uint   `gorm:"primarykey" json:"id"`
    Title   string `gorm:"type:varchar(255); not null" json:"title"`
    Content string `gorm:"not null" json:"content"`
    UserID  uint   `json:"-"`
    User    User   `json:"author"`
}

此外,您的回购方法只需稍作改动即可加载它。我添加了错误检查,因为您应该始终使用它们。

func (jobRepo repository) FindAll() ([]entity.Job, error) {
    var jobs []entity.Job
    tx := jobRepo.db.Preload("User").Find(&jobs)

    return jobs, tx.Error
}