resolve conflicts
This commit is contained in:
commit
5bfc042ba9
@ -502,7 +502,7 @@ func (association *Association) buildCondition() *DB {
|
|||||||
|
|
||||||
if association.Relationship.JoinTable != nil {
|
if association.Relationship.JoinTable != nil {
|
||||||
if !tx.Statement.Unscoped && len(association.Relationship.JoinTable.QueryClauses) > 0 {
|
if !tx.Statement.Unscoped && len(association.Relationship.JoinTable.QueryClauses) > 0 {
|
||||||
joinStmt := Statement{DB: tx, Schema: association.Relationship.JoinTable, Table: association.Relationship.JoinTable.Table, Clauses: map[string]clause.Clause{}}
|
joinStmt := Statement{DB: tx, Context: tx.Statement.Context, Schema: association.Relationship.JoinTable, Table: association.Relationship.JoinTable.Table, Clauses: map[string]clause.Clause{}}
|
||||||
for _, queryClause := range association.Relationship.JoinTable.QueryClauses {
|
for _, queryClause := range association.Relationship.JoinTable.QueryClauses {
|
||||||
joinStmt.AddClause(queryClause)
|
joinStmt.AddClause(queryClause)
|
||||||
}
|
}
|
||||||
|
@ -96,12 +96,12 @@ func BuildQuerySQL(db *gorm.DB) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// inline joins
|
// inline joins
|
||||||
joins := []clause.Join{}
|
fromClause := clause.From{}
|
||||||
if fromClause, ok := db.Statement.Clauses["FROM"].Expression.(clause.From); ok {
|
if v, ok := db.Statement.Clauses["FROM"].Expression.(clause.From); ok {
|
||||||
joins = fromClause.Joins
|
fromClause = v
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(db.Statement.Joins) != 0 || len(joins) != 0 {
|
if len(db.Statement.Joins) != 0 || len(fromClause.Joins) != 0 {
|
||||||
if len(db.Statement.Selects) == 0 && len(db.Statement.Omits) == 0 && db.Statement.Schema != nil {
|
if len(db.Statement.Selects) == 0 && len(db.Statement.Omits) == 0 && db.Statement.Schema != nil {
|
||||||
clauseSelect.Columns = make([]clause.Column, len(db.Statement.Schema.DBNames))
|
clauseSelect.Columns = make([]clause.Column, len(db.Statement.Schema.DBNames))
|
||||||
for idx, dbName := range db.Statement.Schema.DBNames {
|
for idx, dbName := range db.Statement.Schema.DBNames {
|
||||||
@ -111,7 +111,7 @@ func BuildQuerySQL(db *gorm.DB) {
|
|||||||
|
|
||||||
for _, join := range db.Statement.Joins {
|
for _, join := range db.Statement.Joins {
|
||||||
if db.Statement.Schema == nil {
|
if db.Statement.Schema == nil {
|
||||||
joins = append(joins, clause.Join{
|
fromClause.Joins = append(fromClause.Joins, clause.Join{
|
||||||
Expression: clause.NamedExpr{SQL: join.Name, Vars: join.Conds},
|
Expression: clause.NamedExpr{SQL: join.Name, Vars: join.Conds},
|
||||||
})
|
})
|
||||||
} else if relation, ok := db.Statement.Schema.Relationships.Relations[join.Name]; ok {
|
} else if relation, ok := db.Statement.Schema.Relationships.Relations[join.Name]; ok {
|
||||||
@ -176,19 +176,19 @@ func BuildQuerySQL(db *gorm.DB) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
joins = append(joins, clause.Join{
|
fromClause.Joins = append(fromClause.Joins, clause.Join{
|
||||||
Type: clause.LeftJoin,
|
Type: clause.LeftJoin,
|
||||||
Table: clause.Table{Name: relation.FieldSchema.Table, Alias: tableAliasName},
|
Table: clause.Table{Name: relation.FieldSchema.Table, Alias: tableAliasName},
|
||||||
ON: clause.Where{Exprs: exprs},
|
ON: clause.Where{Exprs: exprs},
|
||||||
})
|
})
|
||||||
} else {
|
} else {
|
||||||
joins = append(joins, clause.Join{
|
fromClause.Joins = append(fromClause.Joins, clause.Join{
|
||||||
Expression: clause.NamedExpr{SQL: join.Name, Vars: join.Conds},
|
Expression: clause.NamedExpr{SQL: join.Name, Vars: join.Conds},
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
db.Statement.AddClause(clause.From{Joins: joins})
|
db.Statement.AddClause(fromClause)
|
||||||
db.Statement.Joins = nil
|
db.Statement.Joins = nil
|
||||||
} else {
|
} else {
|
||||||
db.Statement.AddClauseIfNotExists(clause.From{})
|
db.Statement.AddClauseIfNotExists(clause.From{})
|
||||||
|
@ -207,7 +207,7 @@ func (db *DB) FindInBatches(dest interface{}, batchSize int, fc func(tx *DB, bat
|
|||||||
return tx
|
return tx
|
||||||
}
|
}
|
||||||
|
|
||||||
func (tx *DB) assignInterfacesToValue(values ...interface{}) {
|
func (db *DB) assignInterfacesToValue(values ...interface{}) {
|
||||||
for _, value := range values {
|
for _, value := range values {
|
||||||
switch v := value.(type) {
|
switch v := value.(type) {
|
||||||
case []clause.Expression:
|
case []clause.Expression:
|
||||||
@ -215,40 +215,40 @@ func (tx *DB) assignInterfacesToValue(values ...interface{}) {
|
|||||||
if eq, ok := expr.(clause.Eq); ok {
|
if eq, ok := expr.(clause.Eq); ok {
|
||||||
switch column := eq.Column.(type) {
|
switch column := eq.Column.(type) {
|
||||||
case string:
|
case string:
|
||||||
if field := tx.Statement.Schema.LookUpField(column); field != nil {
|
if field := db.Statement.Schema.LookUpField(column); field != nil {
|
||||||
tx.AddError(field.Set(tx.Statement.Context, tx.Statement.ReflectValue, eq.Value))
|
db.AddError(field.Set(db.Statement.Context, db.Statement.ReflectValue, eq.Value))
|
||||||
}
|
}
|
||||||
case clause.Column:
|
case clause.Column:
|
||||||
if field := tx.Statement.Schema.LookUpField(column.Name); field != nil {
|
if field := db.Statement.Schema.LookUpField(column.Name); field != nil {
|
||||||
tx.AddError(field.Set(tx.Statement.Context, tx.Statement.ReflectValue, eq.Value))
|
db.AddError(field.Set(db.Statement.Context, db.Statement.ReflectValue, eq.Value))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if andCond, okk := expr.(clause.AndConditions); okk {
|
} else if andCond, okk := expr.(clause.AndConditions); okk {
|
||||||
tx.assignInterfacesToValue(andCond.Exprs)
|
db.assignInterfacesToValue(andCond.Exprs)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
case clause.Expression, map[string]string, map[interface{}]interface{}, map[string]interface{}:
|
case clause.Expression, map[string]string, map[interface{}]interface{}, map[string]interface{}:
|
||||||
if exprs := tx.Statement.BuildCondition(value); len(exprs) > 0 {
|
if exprs := db.Statement.BuildCondition(value); len(exprs) > 0 {
|
||||||
tx.assignInterfacesToValue(exprs)
|
db.assignInterfacesToValue(exprs)
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
if s, err := schema.Parse(value, tx.cacheStore, tx.NamingStrategy); err == nil {
|
if s, err := schema.Parse(value, db.cacheStore, db.NamingStrategy); err == nil {
|
||||||
reflectValue := reflect.Indirect(reflect.ValueOf(value))
|
reflectValue := reflect.Indirect(reflect.ValueOf(value))
|
||||||
switch reflectValue.Kind() {
|
switch reflectValue.Kind() {
|
||||||
case reflect.Struct:
|
case reflect.Struct:
|
||||||
for _, f := range s.Fields {
|
for _, f := range s.Fields {
|
||||||
if f.Readable {
|
if f.Readable {
|
||||||
if v, isZero := f.ValueOf(tx.Statement.Context, reflectValue); !isZero {
|
if v, isZero := f.ValueOf(db.Statement.Context, reflectValue); !isZero {
|
||||||
if field := tx.Statement.Schema.LookUpField(f.Name); field != nil {
|
if field := db.Statement.Schema.LookUpField(f.Name); field != nil {
|
||||||
tx.AddError(field.Set(tx.Statement.Context, tx.Statement.ReflectValue, v))
|
db.AddError(field.Set(db.Statement.Context, db.Statement.ReflectValue, v))
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else if len(values) > 0 {
|
} else if len(values) > 0 {
|
||||||
if exprs := tx.Statement.BuildCondition(values[0], values[1:]...); len(exprs) > 0 {
|
if exprs := db.Statement.BuildCondition(values[0], values[1:]...); len(exprs) > 0 {
|
||||||
tx.assignInterfacesToValue(exprs)
|
db.assignInterfacesToValue(exprs)
|
||||||
}
|
}
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
4
gorm.go
4
gorm.go
@ -124,8 +124,8 @@ func Open(dialector Dialector, opts ...Option) (db *DB, err error) {
|
|||||||
|
|
||||||
for _, opt := range opts {
|
for _, opt := range opts {
|
||||||
if opt != nil {
|
if opt != nil {
|
||||||
if err := opt.Apply(config); err != nil {
|
if applyErr := opt.Apply(config); applyErr != nil {
|
||||||
return nil, err
|
return nil, applyErr
|
||||||
}
|
}
|
||||||
defer func(opt Option) {
|
defer func(opt Option) {
|
||||||
if errr := opt.AfterInitialize(db); errr != nil {
|
if errr := opt.AfterInitialize(db); errr != nil {
|
||||||
|
@ -275,7 +275,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
|
|||||||
field.DataType = DataType(dataTyper.GormDataType())
|
field.DataType = DataType(dataTyper.GormDataType())
|
||||||
}
|
}
|
||||||
|
|
||||||
if v, ok := field.TagSettings["AUTOCREATETIME"]; ok || (field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {
|
if v, ok := field.TagSettings["AUTOCREATETIME"]; (ok && utils.CheckTruth(v)) || (!ok && field.Name == "CreatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {
|
||||||
if field.DataType == Time {
|
if field.DataType == Time {
|
||||||
field.AutoCreateTime = UnixTime
|
field.AutoCreateTime = UnixTime
|
||||||
} else if strings.ToUpper(v) == "NANO" {
|
} else if strings.ToUpper(v) == "NANO" {
|
||||||
@ -287,7 +287,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if v, ok := field.TagSettings["AUTOUPDATETIME"]; ok || (field.Name == "UpdatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {
|
if v, ok := field.TagSettings["AUTOUPDATETIME"]; (ok && utils.CheckTruth(v)) || (!ok && field.Name == "UpdatedAt" && (field.DataType == Time || field.DataType == Int || field.DataType == Uint)) {
|
||||||
if field.DataType == Time {
|
if field.DataType == Time {
|
||||||
field.AutoUpdateTime = UnixTime
|
field.AutoUpdateTime = UnixTime
|
||||||
} else if strings.ToUpper(v) == "NANO" {
|
} else if strings.ToUpper(v) == "NANO" {
|
||||||
|
@ -263,7 +263,6 @@ func TestSaveHasManyCircularReference(t *testing.T) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func TestAssociationError(t *testing.T) {
|
func TestAssociationError(t *testing.T) {
|
||||||
DB = DB.Debug()
|
|
||||||
user := *GetUser("TestAssociationError", Config{Pets: 2, Company: true, Account: true, Languages: 2})
|
user := *GetUser("TestAssociationError", Config{Pets: 2, Company: true, Account: true, Languages: 2})
|
||||||
DB.Create(&user)
|
DB.Create(&user)
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ require (
|
|||||||
github.com/jinzhu/now v1.1.5
|
github.com/jinzhu/now v1.1.5
|
||||||
github.com/lib/pq v1.10.4
|
github.com/lib/pq v1.10.4
|
||||||
github.com/mattn/go-sqlite3 v1.14.12 // indirect
|
github.com/mattn/go-sqlite3 v1.14.12 // indirect
|
||||||
golang.org/x/crypto v0.0.0-20220321153916-2c7772ba3064 // indirect
|
golang.org/x/crypto v0.0.0-20220331220935-ae2d96664a29 // indirect
|
||||||
gorm.io/driver/mysql v1.3.2
|
gorm.io/driver/mysql v1.3.2
|
||||||
gorm.io/driver/postgres v1.3.1
|
gorm.io/driver/postgres v1.3.1
|
||||||
gorm.io/driver/sqlite v1.3.1
|
gorm.io/driver/sqlite v1.3.1
|
||||||
|
Loading…
x
Reference in New Issue
Block a user