Gorm创建并返回值many2many

rryofs0p  于 2022-12-07  发布在  Go
关注(0)|答案(1)|浏览(148)

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

用户响应结构

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"`
}

角色结构

type Roles struct {
    ID   int `json:"id" gorm:"<-:false;primaryKey"`
    Name string
}

这是一个创建数据的函数,我想返回值[ ]roles。Roles

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),
    }
55ooxyrt

55ooxyrt1#

据我所知,您已经有了用户数据和角色ID。我想您还需要获取角色名称:

err := r.db.Find(&createdUser.Roles, req.RolesID)
// err handling

也就是说,您的类型和名称有点不清楚。UserRespone(注意拼写错误)可能应该命名为DBUser-它是否用作响应或其他内容并不重要,它代表用户的数据库条目,对吗?
此外,我只能对createdUserUsersRoles的类型和字段进行假设,因此我可能遗漏了一些东西。
我认为createdUser的类型是UserRespone-但我认为Roles已经完成了(并且您根本不需要查询任何东西)。如果不是,那么您应该为此引入一个新类型,例如RequestUser(与DBUser相对),它只包含Role id而不包含Role名称。将DB条目和响应数据合并为同一类型是令人困惑的(而且对我来说耦合得有点太紧了)。

相关问题