Используйте SubQuery в Select - PullRequest
0 голосов
/ 24 августа 2018

Есть ли способ использовать функцию SubQuery в Select ?? Я видел это как часть предложения Where, но мне нужно выбрать.

Я решаю это временно, делая это:

func GetUserProviders(userID int) ([]userprovider, error) {
    providers := []userprovider{}
    query := `SELECT (count(users_providers.user_id) > 0) 
                FROM users_providers 
                WHERE users_providers.user_id = '` + strconv.Itoa(userID) + `' AND users_providers.provider_id=providers.id`
    rows, err := db.DB.Table("providers").
        Select("providers.id, providers.name, (" + query + ") as checked").Rows()

    if err == nil {
        for rows.Next() {
            var provider = userprovider{}
            db.DB.ScanRows(rows, &provider)
            providers = append(providers, provider)
        }
    }
    return providers, err
}

Но я бы предпочел, если возможно, использовать функцию ORM вместо конкатенации строк.

В этом случае опасности нет, но для других случаев было бы здорово, если бы была какая-либо функция для преобразования

// SQL expression
type expr struct {
    expr string
    args []interface{}
}

в продезинфицированную строку.

Заранее спасибо.

1 Ответ

0 голосов
/ 24 августа 2018

Хорошо ... Я нашел решение:

q := db.DB.Table("users_providers").
    Select("(count(users_providers.user_id) > 0)").
    Where("users_providers.user_id = ? AND users_providers.provider_id=providers.id", userID).
    SubQuery()
rows, err := db.DB.Table("providers").
    Select("providers.id, providers.name, ? as checked", q).
    Rows()

Функция Select принимает 2 аргумента: один для запроса и другой для аргументов, работающих так же, как Where.

Спасибо в любом случае:)

...