我正在使用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
);
答案 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"`
}