From a952601f21dbd6b0b4fd574d8c48c5bb1b26e58e Mon Sep 17 00:00:00 2001 From: Jinzhu Date: Fri, 3 Apr 2015 16:32:53 +0800 Subject: [PATCH 1/3] Fix query related resources with customized column name --- scope_private.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/scope_private.go b/scope_private.go index 8de12ced..99dda2ed 100644 --- a/scope_private.go +++ b/scope_private.go @@ -395,8 +395,17 @@ func (scope *Scope) related(value interface{}, foreignKeys ...string) *Scope { fromFields := scope.Fields() toFields := toScope.Fields() for _, foreignKey := range append(foreignKeys, toScope.typeName()+"Id", scope.typeName()+"Id") { - fromField := fromFields[ToDBName(foreignKey)] - toField := toFields[ToDBName(foreignKey)] + var fromField, toField *Field + if field, ok := scope.FieldByName(foreignKey); ok { + fromField = field + } else { + fromField = fromFields[ToDBName(foreignKey)] + } + if field, ok := toScope.FieldByName(foreignKey); ok { + toField = field + } else { + toField = toFields[ToDBName(foreignKey)] + } if fromField != nil { if relationship := fromField.Relationship; relationship != nil { From 640700d39158db83e0445a8146313eba3ff2c834 Mon Sep 17 00:00:00 2001 From: Eduardo Trujillo Date: Fri, 3 Apr 2015 23:08:35 -0400 Subject: [PATCH 2/3] Add an example with time --- README.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/README.md b/README.md index 26edcaa0..0c4ea83a 100644 --- a/README.md +++ b/README.md @@ -213,6 +213,11 @@ db.Where("name LIKE ?", "%jin%").Find(&users) // AND db.Where("name = ? and age >= ?", "jinzhu", "22").Find(&users) + +// Time +db.Where("updated_at > ?", lastWeek).Find(&users) + +db.Where("created_at BETWEEN ? AND ?", lastWeek, today).Find(&users) ``` ### Query With Where (Struct & Map) From b9a39be9c5e77bb0bfebd516114a8a4d605c645a Mon Sep 17 00:00:00 2001 From: Jinzhu Date: Wed, 8 Apr 2015 11:36:01 +0800 Subject: [PATCH 3/3] Add Tabler --- model_struct.go | 16 +++++++++++----- scope.go | 25 ++++++++++++++++++++++++- 2 files changed, 35 insertions(+), 6 deletions(-) diff --git a/model_struct.go b/model_struct.go index f73c902b..a70489fc 100644 --- a/model_struct.go +++ b/model_struct.go @@ -17,7 +17,7 @@ type ModelStruct struct { PrimaryFields []*StructField StructFields []*StructField ModelType reflect.Type - TableName string + TableName func(*DB) string } type StructField struct { @@ -97,18 +97,24 @@ func (scope *Scope) GetModelStruct() *ModelStruct { if fm := reflect.New(scopeType).MethodByName("TableName"); fm.IsValid() { if results := fm.Call([]reflect.Value{}); len(results) > 0 { if name, ok := results[0].Interface().(string); ok { - modelStruct.TableName = name + modelStruct.TableName = func(*DB) string { + return name + } } } } else { - modelStruct.TableName = ToDBName(scopeType.Name()) + name := ToDBName(scopeType.Name()) if scope.db == nil || !scope.db.parent.singularTable { for index, reg := range pluralMapKeys { - if reg.MatchString(modelStruct.TableName) { - modelStruct.TableName = reg.ReplaceAllString(modelStruct.TableName, pluralMapValues[index]) + if reg.MatchString(name) { + name = reg.ReplaceAllString(name, pluralMapValues[index]) } } } + + modelStruct.TableName = func(*DB) string { + return name + } } // Get all fields diff --git a/scope.go b/scope.go index d8e39348..86994a85 100644 --- a/scope.go +++ b/scope.go @@ -224,12 +224,35 @@ func (scope *Scope) AddToVars(value interface{}) string { } } +type tabler interface { + TableName() string +} + +type dbTabler interface { + TableName(*DB) string +} + // TableName get table name func (scope *Scope) TableName() string { if scope.Search != nil && len(scope.Search.tableName) > 0 { return scope.Search.tableName } - return scope.GetModelStruct().TableName + + if tabler, ok := scope.Value.(tabler); ok { + return tabler.TableName() + } + + if tabler, ok := scope.Value.(dbTabler); ok { + return tabler.TableName(scope.db) + } + + if scope.GetModelStruct().TableName != nil { + scope.Search.tableName = scope.GetModelStruct().TableName(scope.db) + return scope.Search.tableName + } + + scope.Err(errors.New("wrong table name")) + return "" } func (scope *Scope) QuotedTableName() (name string) {