Как выполнить запрос многие ко многим с помощью SQLBoiler - PullRequest
0 голосов
/ 18 апреля 2019

Я использую 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 вместо кусочка 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

...