Merge pull request #2 from jinzhu/master

update
This commit is contained in:
Vincenzo Prignano 2015-04-08 13:00:40 +01:00
commit 33da3043c2
4 changed files with 51 additions and 8 deletions

View File

@ -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)

View File

@ -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

View File

@ -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) {

View File

@ -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 {