mirror of https://github.com/go-gorm/gorm.git
Save associations based on creatable/updatable permission, close #4056
This commit is contained in:
parent
4373aa01ab
commit
deff0594ee
|
@ -9,9 +9,10 @@ import (
|
||||||
"gorm.io/gorm/schema"
|
"gorm.io/gorm/schema"
|
||||||
)
|
)
|
||||||
|
|
||||||
func SaveBeforeAssociations(db *gorm.DB) {
|
func SaveBeforeAssociations(create bool) func(db *gorm.DB) {
|
||||||
|
return func(db *gorm.DB) {
|
||||||
if db.Error == nil && db.Statement.Schema != nil {
|
if db.Error == nil && db.Statement.Schema != nil {
|
||||||
selectColumns, restricted := db.Statement.SelectAndOmitColumns(true, false)
|
selectColumns, restricted := db.Statement.SelectAndOmitColumns(create, !create)
|
||||||
|
|
||||||
// Save Belongs To associations
|
// Save Belongs To associations
|
||||||
for _, rel := range db.Statement.Schema.Relationships.BelongsTo {
|
for _, rel := range db.Statement.Schema.Relationships.BelongsTo {
|
||||||
|
@ -88,10 +89,12 @@ func SaveBeforeAssociations(db *gorm.DB) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func SaveAfterAssociations(db *gorm.DB) {
|
func SaveAfterAssociations(create bool) func(db *gorm.DB) {
|
||||||
|
return func(db *gorm.DB) {
|
||||||
if db.Error == nil && db.Statement.Schema != nil {
|
if db.Error == nil && db.Statement.Schema != nil {
|
||||||
selectColumns, restricted := db.Statement.SelectAndOmitColumns(true, false)
|
selectColumns, restricted := db.Statement.SelectAndOmitColumns(create, !create)
|
||||||
|
|
||||||
// Save Has One associations
|
// Save Has One associations
|
||||||
for _, rel := range db.Statement.Schema.Relationships.HasOne {
|
for _, rel := range db.Statement.Schema.Relationships.HasOne {
|
||||||
|
@ -304,6 +307,7 @@ func SaveAfterAssociations(db *gorm.DB) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func onConflictOption(stmt *gorm.Statement, s *schema.Schema, selectColumns map[string]bool, restricted bool, defaultUpdatingColumns []string) clause.OnConflict {
|
func onConflictOption(stmt *gorm.Statement, s *schema.Schema, selectColumns map[string]bool, restricted bool, defaultUpdatingColumns []string) clause.OnConflict {
|
||||||
if stmt.DB.FullSaveAssociations {
|
if stmt.DB.FullSaveAssociations {
|
||||||
|
|
|
@ -17,9 +17,9 @@ func RegisterDefaultCallbacks(db *gorm.DB, config *Config) {
|
||||||
createCallback := db.Callback().Create()
|
createCallback := db.Callback().Create()
|
||||||
createCallback.Match(enableTransaction).Register("gorm:begin_transaction", BeginTransaction)
|
createCallback.Match(enableTransaction).Register("gorm:begin_transaction", BeginTransaction)
|
||||||
createCallback.Register("gorm:before_create", BeforeCreate)
|
createCallback.Register("gorm:before_create", BeforeCreate)
|
||||||
createCallback.Register("gorm:save_before_associations", SaveBeforeAssociations)
|
createCallback.Register("gorm:save_before_associations", SaveBeforeAssociations(true))
|
||||||
createCallback.Register("gorm:create", Create(config))
|
createCallback.Register("gorm:create", Create(config))
|
||||||
createCallback.Register("gorm:save_after_associations", SaveAfterAssociations)
|
createCallback.Register("gorm:save_after_associations", SaveAfterAssociations(true))
|
||||||
createCallback.Register("gorm:after_create", AfterCreate)
|
createCallback.Register("gorm:after_create", AfterCreate)
|
||||||
createCallback.Match(enableTransaction).Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction)
|
createCallback.Match(enableTransaction).Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction)
|
||||||
|
|
||||||
|
@ -40,9 +40,9 @@ func RegisterDefaultCallbacks(db *gorm.DB, config *Config) {
|
||||||
updateCallback.Match(enableTransaction).Register("gorm:begin_transaction", BeginTransaction)
|
updateCallback.Match(enableTransaction).Register("gorm:begin_transaction", BeginTransaction)
|
||||||
updateCallback.Register("gorm:setup_reflect_value", SetupUpdateReflectValue)
|
updateCallback.Register("gorm:setup_reflect_value", SetupUpdateReflectValue)
|
||||||
updateCallback.Register("gorm:before_update", BeforeUpdate)
|
updateCallback.Register("gorm:before_update", BeforeUpdate)
|
||||||
updateCallback.Register("gorm:save_before_associations", SaveBeforeAssociations)
|
updateCallback.Register("gorm:save_before_associations", SaveBeforeAssociations(false))
|
||||||
updateCallback.Register("gorm:update", Update)
|
updateCallback.Register("gorm:update", Update)
|
||||||
updateCallback.Register("gorm:save_after_associations", SaveAfterAssociations)
|
updateCallback.Register("gorm:save_after_associations", SaveAfterAssociations(false))
|
||||||
updateCallback.Register("gorm:after_update", AfterUpdate)
|
updateCallback.Register("gorm:after_update", AfterUpdate)
|
||||||
updateCallback.Match(enableTransaction).Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction)
|
updateCallback.Match(enableTransaction).Register("gorm:commit_or_rollback_transaction", CommitOrRollbackTransaction)
|
||||||
|
|
||||||
|
|
|
@ -235,6 +235,8 @@ func Parse(dest interface{}, cacheStore *sync.Map, namer Namer) (*Schema, error)
|
||||||
if field.DataType == "" && (field.Creatable || field.Updatable || field.Readable) {
|
if field.DataType == "" && (field.Creatable || field.Updatable || field.Readable) {
|
||||||
if schema.parseRelation(field); schema.err != nil {
|
if schema.parseRelation(field); schema.err != nil {
|
||||||
return schema, schema.err
|
return schema, schema.err
|
||||||
|
} else {
|
||||||
|
schema.FieldsByName[field.Name] = field
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue