orm5

发布时间 2023-12-21 22:41:30作者: codestacklinuxer
var user dot1xDataItem
user.UserName = "test11"
dot1xDb.Find(&user)

执行路径:一样

只是在 BuildQuerySQL的时候 会解析传进来参数里面的values,有值就当做where  exp eq 处理

func BuildQuerySQL(db *gorm.DB) {
	if db.Statement.Schema != nil {
		for _, c := range db.Statement.Schema.QueryClauses {
			db.Statement.AddClause(c)
		}
	}

	if db.Statement.SQL.Len() == 0 {
		db.Statement.SQL.Grow(100)
		clauseSelect := clause.Select{Distinct: db.Statement.Distinct}

		if db.Statement.ReflectValue.Kind() == reflect.Struct && db.Statement.ReflectValue.Type() == db.Statement.Schema.ModelType {
			var conds []clause.Expression 
			for _, primaryField := range db.Statement.Schema.PrimaryFields {
				if v, isZero := primaryField.ValueOf(db.Statement.Context, db.Statement.ReflectValue); !isZero {
					conds = append(conds, clause.Eq{Column: clause.Column{Table: db.Statement.Table, Name: primaryField.DBName}, Value: v})
				}/*/此时传进来的dest 参数是有值的user_name=”test11“
                / 就会组装 clause.Eq 
                // Eq equal to for where
                type Eq struct {
	                Column interface{}
	                Value  interface{}
                }
                */
			}

			if len(conds) > 0 {
				db.Statement.AddClause(clause.Where{Exprs: conds})
                // 将eq 添加到where Clauses
			}
		}

	
		db.Statement.AddClauseIfNotExists(clauseSelect)  //select

		db.Statement.Build(db.Statement.BuildClauses...)
	}
}