diff --git a/dbHandler.go b/dbHandler.go index fc5bd95..8a301dc 100644 --- a/dbHandler.go +++ b/dbHandler.go @@ -129,12 +129,12 @@ func (dH *DBHandler) AddNewColum(model any) error { // // Returns: // - error: Any query error or “not found” message. -func (dH *DBHandler) GetById(model any, relation string, id uint) (err error) { +func (dH *DBHandler) GetById(model any, id uint, relations ...string) (err error) { dH.logger.Debug("getById", "find id "+fmt.Sprint(id)) query := dH.db - if relation != "" { + for _, relation := range relations { query = query.Preload(relation) } @@ -170,10 +170,10 @@ func (dH *DBHandler) GetById(model any, relation string, id uint) (err error) { // // Returns: // - error: Any database query error. -func (dH *DBHandler) GetByKey(model any, relation string, key string, value any, LikeSearch bool) error { +func (dH *DBHandler) GetByKey(model any, key string, value any, LikeSearch bool, relations ...string) error { query := dH.db - if relation != "" { + for _, relation := range relations { query = query.Preload(relation) } if LikeSearch { @@ -203,22 +203,26 @@ func (dH *DBHandler) GetByKey(model any, relation string, key string, value any, // // Returns: // - error: If the model is invalid or query/update fails. -func (dH *DBHandler) UpdateValuesById(model any, relation string, id uint) error { - dH.logger.Debug("updateValuesById", "model"+fmt.Sprint(model)) +func (dH *DBHandler) UpdateValuesById(model any, id uint, relations ...string) error { + dH.logger.Debug("updateValuesByKey", "model"+fmt.Sprint(model)) + modelType := reflect.TypeOf(model) if modelType.Kind() != reflect.Ptr { return errors.New("model must be a pointer to struct") } lookUpModel := reflect.New(modelType.Elem()).Interface() - if err := dH.GetById(lookUpModel, relation, id); err != nil { + if err := dH.GetById(lookUpModel, id, relations...); err != nil { return err } - query := dH.db - if relation != "" { + // Preload relations + query := dH.db + for _, relation := range relations { query = query.Preload(relation) } + + // Update only provided keys return query.Model(lookUpModel).Updates(model).Error } @@ -240,7 +244,7 @@ func (dH *DBHandler) UpdateValuesById(model any, relation string, id uint) error // // Returns: // - error: Any query or update error. -func (dH *DBHandler) UpdateValuesByKey(model any, relation string, key string, value any) error { +func (dH *DBHandler) UpdateValuesByKey(model any, key string, value any, relations ...string) error { dH.logger.Debug("updateValuesByKey", "model"+fmt.Sprint(model)) modelType := reflect.TypeOf(model) if modelType.Kind() != reflect.Ptr { @@ -248,13 +252,13 @@ func (dH *DBHandler) UpdateValuesByKey(model any, relation string, key string, v } lookUpModel := reflect.New(modelType.Elem()).Interface() - if err := dH.GetByKey(lookUpModel, "", key, value, false); err != nil { + if err := dH.GetByKey(lookUpModel, key, value, false, relations...); err != nil { return err } query := dH.db - if relation != "" { + for _, relation := range relations { query = query.Preload(relation) } return query.Model(lookUpModel).Updates(model).Error @@ -267,19 +271,13 @@ func (dH *DBHandler) DeleteById(model any, relation string, ids ...uint) error { if len(ids) == 1 && ids[0] == 0 { dH.logger.Debug("deleteById", "delete ALL records!") - return dH.db.Session(&gorm.Session{AllowGlobalUpdate: true}). + return dH.db.Session(&gorm.Session{AllowGlobalUpdate: true, FullSaveAssociations: true}). Delete(model).Error } dH.logger.Debug("deleteById", "delete ids "+fmt.Sprint(ids)) - query := dH.db - - if relation != "" { - query = query.Preload(relation) - } - - if err := query.Delete(model, ids).Error; err != nil { + if err := dH.db.Delete(model, ids).Error; err != nil { return fmt.Errorf("delete failed: %w", err) } return nil @@ -302,7 +300,7 @@ func (dH *DBHandler) DeleteById(model any, relation string, ids ...uint) error { // // Returns: // - error: Any deletion error. -func (dH *DBHandler) DeleteByKey(model any, relation string, key string, value any, LikeSearch bool) error { +func (dH *DBHandler) DeleteByKey(model any, key string, value any, LikeSearch bool, relations ...string) error { if LikeSearch { value = strings.ReplaceAll(fmt.Sprint(value), "*", "%") dH.logger.Debug("deleteByKey", "delete like key "+key+" value "+fmt.Sprint(value)) @@ -313,14 +311,14 @@ func (dH *DBHandler) DeleteByKey(model any, relation string, key string, value a query := dH.db - if relation != "" { + for _, relation := range relations { query = query.Preload(relation) } return query.Where(key+" = ?", value).Delete(model).Error } -func (dH *DBHandler) Exists(model any, relation string, key string, value any, likeSearch bool) (found bool) { +func (dH *DBHandler) Exists(model any, key string, value any, likeSearch bool, relations ...string) (found bool) { var query string var args any @@ -350,7 +348,7 @@ func (dH *DBHandler) Exists(model any, relation string, key string, value any, l dH.logger.Debug("exists", "checking existence for key "+query+" value "+fmt.Sprint(args)) datababase := dH.db - if relation != "" { + for _, relation := range relations { datababase = datababase.Preload(relation) }