首页 > 解决方案 > 如何使用 SQLBoiler 执行多对多查询

问题描述

我使用SQLBoiler作为我的 golang ORM。

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

角色:

role_id  desc   name
1        basic  basic

用户:

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

用户角色:

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 而不是包含我的加入表的 models.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

标签: goormmany-to-manysqlboiler

解决方案


推荐阅读