从带有gorm的两个表中选择

时间:2018-02-15 14:14:19

标签: postgresql go go-gorm

我正在使用gorm和postgresql进行旁边项目,我不知道如何在1个请求中解决这个问题:

我的用户类型如下:

type User struct {
    UserId    string
    Email     string
    FirstName string
    LastName  string
    Phone     string
    Address_1 string
    Address_2 string
    City      string
    State     string
    Zip       string
    Gender    string
    ImageUri  string
    Roles     []Role `gorm:"foreignkey:UserId"`
}

我的角色类型如下:

type Role struct {
    UserId string
    Role   string
}

我希望让所有用户都拥有相关的角色,但是现在我正在使用2个请求执行此操作,而我只想使用其中一个:

func (s *Store) ListUsers() ([]User, error) {
    users := []User{}
    if err := db.Joins("join roles ON roles.user_id = users.user_id").Find(&users).Error; err != nil {
        return nil, err
    }

    for i, user := range users {
        roles := []Role{}
        if err := db.Where("user_id = ?", user.UserId).Model(&Role{}).Find(&roles).Error; err != nil {
            return User{}, errors.Wrap(err, "failed to get roles")
        }
        users[i].Roles = roles
    }

    return users, nil
}

我尝试了几个不同的请求,使用Related等...但我的角色切片始终为空。有什么想法吗?

[编辑]我的sql架构

CREATE TABLE IF NOT EXISTS users (
  user_id varchar PRIMARY KEY UNIQUE NOT NULL,
  email varchar UNIQUE NOT NULL,
  first_name varchar,
  last_name varchar,
  phone varchar,
  address_1 varchar,
  address_2 varchar,
  city varchar,
  state varchar,
  zip varchar,
  gender varchar,
  image_uri varchar
);

CREATE TABLE IF NOT EXISTS roles (
  user_id varchar REFERENCES users (user_id) ON DELETE CASCADE,
  role varchar NOT NULL
);

1 个答案:

答案 0 :(得分:0)

@ har07灵魂它可能是你所需要的db.Preload("Roles").Find(&users)但是你不能得到Roles因为你没有宣告primary key用户struct,因此最后您的用户应如下所示:

type User struct {
    UserId    string `gorm:"primary_key"`
    Email     string
    FirstName string
    LastName  string
    Phone     string
    Address_1 string
    Address_2 string
    City      string
    State     string
    Zip       string
    Gender    string
    ImageUri  string
    Roles     []Role `gorm:"foreignkey:UserId"`
}