我想创建一个数据,然后返回该值,但是该值与另一个表相关。
用户响应结构
type UserRespone struct {
ID int `json:"id,omitempty"`
Email string `json:"email"`
FirstName string `json:"first_name"`
LastName string `json:"last_name"`
Address string `json:"address"`
Roles []roles.Roles `json:"roles" gorm:"many2many:users_roles;foreignKey:ID;joinForeignKey:UserID;references:ID;joinReferences:RolesID"`
}
角色struct
type Roles struct {
ID int `json:"id" gorm:"<-:false;primaryKey"`
Name string
}
这是一个创建数据的函数,我想返回值[]角色。角色
func (r *UserRepositoryImpl) AuthSignUp(ctx context.Context, req user.AuthSignUp) (user.UserRespone, error) {
createdUser := req.ToUser()
hashPassword, _ := bcrypt.GenerateFromPassword([]byte(createdUser.Password), bcrypt.DefaultCost)
createdUser.Password = string(hashPassword[:])
result := r.Db.
WithContext(ctx).
Create(&createdUser)
for _, rolesID := range req.RolesID {
userRole := new(user.UsersRoles)
userRole.UserID = createdUser.ID
userRole.RolesID = rolesID
result = r.Db.WithContext(ctx).Create(&userRole)
}
return createdUser.ToResponse(), result.Error
}
我想这样返回值:
user.UserResponse{
ID: 4,
Email: "putri4@gmail.com",
FirstName: "putri",
LastName: "cantik",
Address: "bonang",
Roles: []roles.Roles{
{
ID: 1,
Name: "Admin",
},
{
ID: 2,
Name: "Consumer",
},
},
}
但是当我创建一个数据集时,我只得到这样的值:
user.UserRespones{
ID: 4,
Email: "putri4@gmail.com",
FirstName: "putri",
LastName: "cantik",
Address: "bonang",
Roles: []roles.Roles(nil),
}
据我所知,您已经拥有了用户数据和角色id。我想你也想要得到角色名:
err := r.db.Find(&createdUser.Roles, req.RolesID)
// err handling
也就是说,你的类型和名称有点不清楚。UserRespone
(注意拼写错误)可能应该像DBUser
一样命名——它是否被用作响应或其他东西并不重要,它代表用户的数据库条目,对吗?
另外,我只能对createdUser
和UsersRoles
的类型和字段进行假设,所以我可能遗漏了一些东西。
我认为createdUser
的类型是UserRespone
-但我希望Roles
已经完成(你根本不需要查询任何东西)。如果不是,那么你应该为它引入一个新的类型,例如RequestUser
(而不是DBUser
),它只包含Role
的id,而不包含Role
的名称。将来自请求、db条目和响应数据的数据压缩到同一类型中会令人困惑(而且对我来说耦合得太紧了)。