123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262 |
- // Copyright GoFrame Author(https://goframe.org). All Rights Reserved.
- //
- // This Source Code Form is subject to the terms of the MIT License.
- // If a copy of the MIT was not distributed with this file,
- // You can obtain one at https://github.com/gogf/gf.
- package gdb
- import (
- "fmt"
- "github.com/gogf/gf/container/gset"
- "github.com/gogf/gf/text/gstr"
- "github.com/gogf/gf/util/gconv"
- "github.com/gogf/gf/util/gutil"
- )
- // Fields appends `fieldNamesOrMapStruct` to the operation fields of the model, multiple fields joined using char ','.
- // The parameter `fieldNamesOrMapStruct` can be type of string/map/*map/struct/*struct.
- func (m *Model) Fields(fieldNamesOrMapStruct ...interface{}) *Model {
- length := len(fieldNamesOrMapStruct)
- if length == 0 {
- return m
- }
- switch {
- // String slice.
- case length >= 2:
- return m.appendFieldsByStr(gstr.Join(
- m.mappingAndFilterToTableFields(gconv.Strings(fieldNamesOrMapStruct), true),
- ",",
- ))
- // It needs type asserting.
- case length == 1:
- switch r := fieldNamesOrMapStruct[0].(type) {
- case string:
- return m.appendFieldsByStr(gstr.Join(
- m.mappingAndFilterToTableFields([]string{r}, false), ",",
- ))
- case []string:
- return m.appendFieldsByStr(gstr.Join(
- m.mappingAndFilterToTableFields(r, true), ",",
- ))
- default:
- return m.appendFieldsByStr(gstr.Join(
- m.mappingAndFilterToTableFields(gutil.Keys(r), true), ",",
- ))
- }
- }
- return m
- }
- // FieldsEx appends `fieldNamesOrMapStruct` to the excluded operation fields of the model,
- // multiple fields joined using char ','.
- // Note that this function supports only single table operations.
- // The parameter `fieldNamesOrMapStruct` can be type of string/map/*map/struct/*struct.
- func (m *Model) FieldsEx(fieldNamesOrMapStruct ...interface{}) *Model {
- length := len(fieldNamesOrMapStruct)
- if length == 0 {
- return m
- }
- model := m.getModel()
- switch {
- case length >= 2:
- model.fieldsEx = gstr.Join(m.mappingAndFilterToTableFields(gconv.Strings(fieldNamesOrMapStruct), true), ",")
- return model
- case length == 1:
- switch r := fieldNamesOrMapStruct[0].(type) {
- case string:
- model.fieldsEx = gstr.Join(m.mappingAndFilterToTableFields([]string{r}, false), ",")
- case []string:
- model.fieldsEx = gstr.Join(m.mappingAndFilterToTableFields(r, true), ",")
- default:
- model.fieldsEx = gstr.Join(m.mappingAndFilterToTableFields(gutil.Keys(r), true), ",")
- }
- return model
- }
- return m
- }
- // FieldCount formats and appends commonly used field `COUNT(column)` to the select fields of model.
- func (m *Model) FieldCount(column string, as ...string) *Model {
- asStr := ""
- if len(as) > 0 && as[0] != "" {
- asStr = fmt.Sprintf(` AS %s`, m.db.GetCore().QuoteWord(as[0]))
- }
- return m.appendFieldsByStr(fmt.Sprintf(`COUNT(%s)%s`, m.db.GetCore().QuoteWord(column), asStr))
- }
- // FieldSum formats and appends commonly used field `SUM(column)` to the select fields of model.
- func (m *Model) FieldSum(column string, as ...string) *Model {
- asStr := ""
- if len(as) > 0 && as[0] != "" {
- asStr = fmt.Sprintf(` AS %s`, m.db.GetCore().QuoteWord(as[0]))
- }
- return m.appendFieldsByStr(fmt.Sprintf(`SUM(%s)%s`, m.db.GetCore().QuoteWord(column), asStr))
- }
- // FieldMin formats and appends commonly used field `MIN(column)` to the select fields of model.
- func (m *Model) FieldMin(column string, as ...string) *Model {
- asStr := ""
- if len(as) > 0 && as[0] != "" {
- asStr = fmt.Sprintf(` AS %s`, m.db.GetCore().QuoteWord(as[0]))
- }
- return m.appendFieldsByStr(fmt.Sprintf(`MIN(%s)%s`, m.db.GetCore().QuoteWord(column), asStr))
- }
- // FieldMax formats and appends commonly used field `MAX(column)` to the select fields of model.
- func (m *Model) FieldMax(column string, as ...string) *Model {
- asStr := ""
- if len(as) > 0 && as[0] != "" {
- asStr = fmt.Sprintf(` AS %s`, m.db.GetCore().QuoteWord(as[0]))
- }
- return m.appendFieldsByStr(fmt.Sprintf(`MAX(%s)%s`, m.db.GetCore().QuoteWord(column), asStr))
- }
- // FieldAvg formats and appends commonly used field `AVG(column)` to the select fields of model.
- func (m *Model) FieldAvg(column string, as ...string) *Model {
- asStr := ""
- if len(as) > 0 && as[0] != "" {
- asStr = fmt.Sprintf(` AS %s`, m.db.GetCore().QuoteWord(as[0]))
- }
- return m.appendFieldsByStr(fmt.Sprintf(`AVG(%s)%s`, m.db.GetCore().QuoteWord(column), asStr))
- }
- func (m *Model) appendFieldsByStr(fields string) *Model {
- if fields != "" {
- model := m.getModel()
- if model.fields == defaultFields {
- model.fields = ""
- }
- if model.fields != "" {
- model.fields += ","
- }
- model.fields += fields
- return model
- }
- return m
- }
- func (m *Model) appendFieldsExByStr(fieldsEx string) *Model {
- if fieldsEx != "" {
- model := m.getModel()
- if model.fieldsEx != "" {
- model.fieldsEx += ","
- }
- model.fieldsEx += fieldsEx
- return model
- }
- return m
- }
- // Filter marks filtering the fields which does not exist in the fields of the operated table.
- // Note that this function supports only single table operations.
- // Deprecated, filter feature is automatically enabled from GoFrame v1.16.0, it is so no longer used.
- func (m *Model) Filter() *Model {
- if gstr.Contains(m.tables, " ") {
- panic("function Filter supports only single table operations")
- }
- model := m.getModel()
- model.filter = true
- return model
- }
- // FieldsStr retrieves and returns all fields from the table, joined with char ','.
- // The optional parameter `prefix` specifies the prefix for each field, eg: FieldsStr("u.").
- // Deprecated, use GetFieldsStr instead.
- func (m *Model) FieldsStr(prefix ...string) string {
- return m.GetFieldsStr(prefix...)
- }
- // GetFieldsStr retrieves and returns all fields from the table, joined with char ','.
- // The optional parameter `prefix` specifies the prefix for each field, eg: GetFieldsStr("u.").
- func (m *Model) GetFieldsStr(prefix ...string) string {
- prefixStr := ""
- if len(prefix) > 0 {
- prefixStr = prefix[0]
- }
- tableFields, err := m.TableFields(m.tablesInit)
- if err != nil {
- panic(err)
- }
- if len(tableFields) == 0 {
- panic(fmt.Sprintf(`empty table fields for table "%s"`, m.tables))
- }
- fieldsArray := make([]string, len(tableFields))
- for k, v := range tableFields {
- fieldsArray[v.Index] = k
- }
- newFields := ""
- for _, k := range fieldsArray {
- if len(newFields) > 0 {
- newFields += ","
- }
- newFields += prefixStr + k
- }
- newFields = m.db.GetCore().QuoteString(newFields)
- return newFields
- }
- // FieldsExStr retrieves and returns fields which are not in parameter `fields` from the table,
- // joined with char ','.
- // The parameter `fields` specifies the fields that are excluded.
- // The optional parameter `prefix` specifies the prefix for each field, eg: FieldsExStr("id", "u.").
- // Deprecated, use GetFieldsExStr instead.
- func (m *Model) FieldsExStr(fields string, prefix ...string) string {
- return m.GetFieldsExStr(fields, prefix...)
- }
- // GetFieldsExStr retrieves and returns fields which are not in parameter `fields` from the table,
- // joined with char ','.
- // The parameter `fields` specifies the fields that are excluded.
- // The optional parameter `prefix` specifies the prefix for each field, eg: FieldsExStr("id", "u.").
- func (m *Model) GetFieldsExStr(fields string, prefix ...string) string {
- prefixStr := ""
- if len(prefix) > 0 {
- prefixStr = prefix[0]
- }
- tableFields, err := m.TableFields(m.tablesInit)
- if err != nil {
- panic(err)
- }
- if len(tableFields) == 0 {
- panic(fmt.Sprintf(`empty table fields for table "%s"`, m.tables))
- }
- fieldsExSet := gset.NewStrSetFrom(gstr.SplitAndTrim(fields, ","))
- fieldsArray := make([]string, len(tableFields))
- for k, v := range tableFields {
- fieldsArray[v.Index] = k
- }
- newFields := ""
- for _, k := range fieldsArray {
- if fieldsExSet.Contains(k) {
- continue
- }
- if len(newFields) > 0 {
- newFields += ","
- }
- newFields += prefixStr + k
- }
- newFields = m.db.GetCore().QuoteString(newFields)
- return newFields
- }
- // HasField determine whether the field exists in the table.
- func (m *Model) HasField(field string) (bool, error) {
- tableFields, err := m.TableFields(m.tablesInit)
- if err != nil {
- return false, err
- }
- if len(tableFields) == 0 {
- return false, fmt.Errorf(`empty table fields for table "%s"`, m.tables)
- }
- fieldsArray := make([]string, len(tableFields))
- for k, v := range tableFields {
- fieldsArray[v.Index] = k
- }
- for _, f := range fieldsArray {
- if f == field {
- return true, nil
- }
- }
- return false, nil
- }
|