diff --git a/finisher_api.go b/finisher_api.go index 63e7f6ab..42c62ef0 100644 --- a/finisher_api.go +++ b/finisher_api.go @@ -641,13 +641,13 @@ func (db *DB) Restore(values interface{}) (tx *DB) { tx.Statement.Unscoped = true tx.Statement.Parse(values) - dest := make(map[string]interface{}) - for _, c := range tx.Statement.Schema.DeleteClauses { - fieldName := c.(SoftDeleteDeleteClause).Field.DBName - dest[fieldName] = nil - } + tx.Statement.Dest = make(map[string]interface{}) - tx.Statement.Dest = dest + for _, c := range tx.Statement.Schema.DeleteClauses { + if optimizer, ok := c.(UnDeleteDester); ok { + optimizer.SetUnDeleteDest(tx.Statement) + } + } return tx.callbacks.Update().Execute(tx) } \ No newline at end of file diff --git a/soft_delete.go b/soft_delete.go index af02f8fd..387b0497 100644 --- a/soft_delete.go +++ b/soft_delete.go @@ -162,3 +162,13 @@ func (sd SoftDeleteDeleteClause) ModifyStatement(stmt *Statement) { stmt.Build("UPDATE", "SET", "WHERE") } } + +func (sd SoftDeleteDeleteClause) SetUnDeleteDest(stmt *Statement) { + if stmt.Unscoped { + if sd.Field.DefaultValue != "" { + stmt.SetColumn(sd.Field.DBName, clause.Expr{SQL: sd.Field.DefaultValue}, true) + } else { + stmt.SetColumn(sd.Field.DBName, nil, true) + } + } +} \ No newline at end of file diff --git a/statement.go b/statement.go index 8b682c84..4ab4d01a 100644 --- a/statement.go +++ b/statement.go @@ -57,6 +57,11 @@ type StatementModifier interface { ModifyStatement(*Statement) } +// UnDeleteDester set undelete dest interface +type UnDeleteDester interface { + SetUnDeleteDest(*Statement) +} + // WriteString write string func (stmt *Statement) WriteString(str string) (int, error) { return stmt.SQL.WriteString(str)