forked from mirror/gorm
Refactor cascade delete associations
This commit is contained in:
parent
06d534d6ea
commit
a932175ccf
|
@ -2,6 +2,7 @@ package callbacks
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"reflect"
|
"reflect"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"gorm.io/gorm"
|
"gorm.io/gorm"
|
||||||
"gorm.io/gorm/clause"
|
"gorm.io/gorm/clause"
|
||||||
|
@ -37,7 +38,18 @@ func DeleteBeforeAssociations(db *gorm.DB) {
|
||||||
withoutConditions := false
|
withoutConditions := false
|
||||||
|
|
||||||
if len(db.Statement.Selects) > 0 {
|
if len(db.Statement.Selects) > 0 {
|
||||||
tx = tx.Select(db.Statement.Selects)
|
var selects []string
|
||||||
|
for _, s := range db.Statement.Selects {
|
||||||
|
if s == clause.Associations {
|
||||||
|
selects = append(selects, s)
|
||||||
|
} else if strings.HasPrefix(s, column+".") {
|
||||||
|
selects = append(selects, strings.TrimPrefix(s, column+"."))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if len(selects) > 0 {
|
||||||
|
tx = tx.Select(selects)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for _, cond := range queryConds {
|
for _, cond := range queryConds {
|
||||||
|
|
|
@ -136,7 +136,7 @@ func TestDeleteWithAssociations(t *testing.T) {
|
||||||
t.Fatalf("failed to create user, got error %v", err)
|
t.Fatalf("failed to create user, got error %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := DB.Select(clause.Associations).Delete(&user).Error; err != nil {
|
if err := DB.Select(clause.Associations, "Pets.Toy").Delete(&user).Error; err != nil {
|
||||||
t.Fatalf("failed to delete user, got error %v", err)
|
t.Fatalf("failed to delete user, got error %v", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue