如何使用SQLBoiler执行多对多查询

时间:2019-04-18 13:03:07

标签: go orm many-to-many

我使用SQLBoiler作为我的golang ORM。

我正在尝试查询用户及其所有角色,为此,我有以下表格:

角色:

role_id  desc   name
1        basic  basic

用户:

user_id password    user_name   created_at  updated_at  updated_by ...
1        ...        ...         ...         ...         ...  

USERS_ROLES:

id  user_id role_id
1   1       1
foreign keys: user_id, role_id

我正尝试通过以下方式查询(不使用sql查询)用户及其所有角色:

func getUserRoles(user *models.USERS) (models.USERROLESSlice, error) {
    if roles, err := user.UserUSERROLESS().All(context.Background(), DB); err != nil {
        infra.LogError("failed to query user roles", err)
        return nil, err
    } else {
        return roles, nil
    }
} 

这给了我models.USERROLESSlice而不是切片slice.ROLES 其中包含我的联接表。

或仅使用:

   if usr, err := models.USERSS(qm.Where(query, req.Email, req.Password),qm.Load("ROLES")).One(context.Background(), DB); err != nil && err.Error() == "sql: no rows in result set" {
        infra.LogInfo(fmt.Sprintf("no result for %s", req.Email))
        return nil, nil
    } 

如果我有其他对象关系,我会做的 但是这些都不给我我期望的结果。

有人知道什么是简单而优雅的方法吗?

编辑: 现在,我只是使用qm.SQL前进

    if roles, err := models.ROLESS(qm.SQL("SELECT roles.* FROM user_roles INNER JOIN roles ON user_roles.role_id = roles.role_id WHERE user_roles.user_id=@uid", user.UserID)).All(context.Background(), DB); err != nil {
    infra.LogError("failed to query user roles", err)
    return nil, err
}

但是我还是在寻找一种优雅的方式,您可以在以下链接中找到一些示例: https://github.com/volatiletech/sqlboiler

0 个答案:

没有答案