diff --git a/callbacks/query.go b/callbacks/query.go index e89dd199..ffffb46b 100644 --- a/callbacks/query.go +++ b/callbacks/query.go @@ -259,6 +259,8 @@ func BuildQuerySQL(db *gorm.DB) { db.Statement.AddClauseIfNotExists(clause.From{}) } + clauseSelect.Columns = append(clauseSelect.Columns, db.Statement.AdditionalSelects...) + db.Statement.AddClauseIfNotExists(clauseSelect) db.Statement.Build(db.Statement.BuildClauses...) diff --git a/chainable_api.go b/chainable_api.go index 3dc7256e..5d85321d 100644 --- a/chainable_api.go +++ b/chainable_api.go @@ -173,6 +173,50 @@ func (db *DB) Select(query interface{}, args ...interface{}) (tx *DB) { return } +// AdditionalSelect specify fields that you want when querying +// +// Use AdditionalSelect when you want add a subset of the fields. By default, GORM will select all fields. +// AdditionalSelect accepts both string arguments and arrays. +// +// // Select name and age of user using multiple arguments +// db.AdditionalSelect(clause.Column{ +// Table: "users", +// Name: "id", +// Alias: "user_id", +// }, clause.Column{ +// Table: "users", +// Name: "name", +// Alias: "user_name", +// }).Find(&users) +// // Select name and age of user using an array +// db.AdditionalSelect([]clause.Column{ +// { +// Table: "users", +// Name: "id", +// Alias: "user_id", +// }, +// { +// Table: "users", +// Name: "name", +// Alias: "user_name", +// }, +// }).Find(&users) +func (db *DB) AdditionalSelect(selects interface{}) (tx *DB) { + tx = db.getInstance() + + switch v := selects.(type) { + case []clause.Column: + tx.Statement.AdditionalSelects = v + + case clause.Column: + tx.Statement.AdditionalSelects = []clause.Column{v} + default: + tx.AddError(fmt.Errorf("unsupported additional select args %v", selects)) + } + + return +} + // Omit specify fields that you want to ignore when creating, updating and querying func (db *DB) Omit(columns ...string) (tx *DB) { tx = db.getInstance() diff --git a/statement.go b/statement.go index 59c0b772..18eaad23 100644 --- a/statement.go +++ b/statement.go @@ -30,8 +30,9 @@ type Statement struct { Clauses map[string]clause.Clause BuildClauses []string Distinct bool - Selects []string // selected columns - Omits []string // omit columns + Selects []string // selected columns + AdditionalSelects []clause.Column // additional selected columns + Omits []string // omit columns Joins []join Preloads map[string][]interface{} Settings sync.Map