Я использую 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