Gorm创建并返回值many2many



我想创建一个数据,然后返回该值,但是该值与另一个表相关。

用户响应结构

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一样命名——它是否被用作响应或其他东西并不重要,它代表用户的数据库条目,对吗?

另外,我只能对createdUserUsersRoles的类型和字段进行假设,所以我可能遗漏了一些东西。

我认为createdUser的类型是UserRespone-但我希望Roles已经完成(你根本不需要查询任何东西)。如果不是,那么你应该为它引入一个新的类型,例如RequestUser(而不是DBUser),它只包含Role的id,而不包含Role的名称。将来自请求、db条目和响应数据的数据压缩到同一类型中会令人困惑(而且对我来说耦合得太紧了)。

相关内容

  • 没有找到相关文章

最新更新