fix: keep nil when dest is ptr & dest is nil[notfound]
This commit is contained in:
parent
ad81206cc2
commit
8ce25a5dd1
@ -115,7 +115,8 @@ func (p *processor) Execute(db *DB) *DB {
|
|||||||
if stmt.Dest != nil {
|
if stmt.Dest != nil {
|
||||||
stmt.ReflectValue = reflect.ValueOf(stmt.Dest)
|
stmt.ReflectValue = reflect.ValueOf(stmt.Dest)
|
||||||
for stmt.ReflectValue.Kind() == reflect.Ptr {
|
for stmt.ReflectValue.Kind() == reflect.Ptr {
|
||||||
if stmt.ReflectValue.IsNil() && stmt.ReflectValue.CanAddr() {
|
stmt.DestIsNil = stmt.ReflectValue.IsNil()
|
||||||
|
if stmt.DestIsNil && stmt.ReflectValue.CanAddr() {
|
||||||
stmt.ReflectValue.Set(reflect.New(stmt.ReflectValue.Type().Elem()))
|
stmt.ReflectValue.Set(reflect.New(stmt.ReflectValue.Type().Elem()))
|
||||||
}
|
}
|
||||||
|
|
||||||
|
2
scan.go
2
scan.go
@ -342,7 +342,7 @@ func Scan(rows Rows, db *DB, mode ScanMode) {
|
|||||||
|
|
||||||
if db.RowsAffected == 0 && db.Statement.RaiseErrorOnNotFound && db.Error == nil {
|
if db.RowsAffected == 0 && db.Statement.RaiseErrorOnNotFound && db.Error == nil {
|
||||||
db.AddError(ErrRecordNotFound)
|
db.AddError(ErrRecordNotFound)
|
||||||
if db.NotFoundAsNilWhenPtr && db.Statement.Dest != nil && reflect.ValueOf(db.Statement.Dest).Kind() == reflect.Ptr {
|
if db.Statement.DestIsNil {
|
||||||
// reset dest to nil
|
// reset dest to nil
|
||||||
reflect.ValueOf(db.Statement.Dest).Elem().Set(reflect.Zero(reflect.ValueOf(db.Statement.Dest).Elem().Type()))
|
reflect.ValueOf(db.Statement.Dest).Elem().Set(reflect.Zero(reflect.ValueOf(db.Statement.Dest).Elem().Type()))
|
||||||
}
|
}
|
||||||
|
@ -26,6 +26,7 @@ type Statement struct {
|
|||||||
Model interface{}
|
Model interface{}
|
||||||
Unscoped bool
|
Unscoped bool
|
||||||
Dest interface{}
|
Dest interface{}
|
||||||
|
DestIsNil bool
|
||||||
ReflectValue reflect.Value
|
ReflectValue reflect.Value
|
||||||
Clauses map[string]clause.Clause
|
Clauses map[string]clause.Clause
|
||||||
BuildClauses []string
|
BuildClauses []string
|
||||||
|
@ -208,13 +208,7 @@ func TestFind(t *testing.T) {
|
|||||||
|
|
||||||
t.Run("NotFoundAsNil", func(t *testing.T) {
|
t.Run("NotFoundAsNil", func(t *testing.T) {
|
||||||
var first *User
|
var first *User
|
||||||
if err := DB.Where("name = ?", "find-not-found").First(&first).Error; err != nil {
|
if err := DB.Where("name = ?", "find not found").First(&first).Error; err != nil {
|
||||||
AssertEqual(t, err, gorm.ErrRecordNotFound)
|
|
||||||
AssertEqual(t, first == nil, false)
|
|
||||||
}
|
|
||||||
|
|
||||||
DB.Config.NotFoundAsNilWhenPtr = true
|
|
||||||
if err := DB.Where("name = ?", "find-not-found").First(&first).Error; err != nil {
|
|
||||||
AssertEqual(t, err, gorm.ErrRecordNotFound)
|
AssertEqual(t, err, gorm.ErrRecordNotFound)
|
||||||
AssertEqual(t, first, nil)
|
AssertEqual(t, first, nil)
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user