// Copyright GoFrame Author(https://goframe.org). All Rights Reserved. // // This Source Code Form is subject to the terms of the MIT License. // If a copy of the MIT was not distributed with this file, // You can obtain one at https://github.com/gogf/gf. package database import ( "database/sql" "git.magicany.cc/black1552/gin-base/database/intlog" "github.com/gogf/gf/v2/errors/gcode" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/text/gstr" ) // Delete does "DELETE FROM ... " statement for the model. // The optional parameter `where` is the same as the parameter of Model.Where function, // see Model.Where. func (m *Model) Delete(where ...any) (result sql.Result, err error) { var ctx = m.GetCtx() if len(where) > 0 { return m.Where(where[0], where[1:]...).Delete() } defer func() { if err == nil { m.checkAndRemoveSelectCache(ctx) } }() var ( conditionWhere, conditionExtra, conditionArgs = m.formatCondition(ctx, false, false) conditionStr = conditionWhere + conditionExtra fieldNameDelete, fieldTypeDelete = m.softTimeMaintainer().GetFieldInfo(ctx, "", m.tablesInit, SoftTimeFieldDelete) ) if m.unscoped { fieldNameDelete = "" } if !gstr.ContainsI(conditionStr, " WHERE ") || (fieldNameDelete != "" && !gstr.ContainsI(conditionStr, " AND ")) { intlog.Printf( ctx, `sql condition string "%s" has no WHERE for DELETE operation, fieldNameDelete: %s`, conditionStr, fieldNameDelete, ) return nil, gerror.NewCode( gcode.CodeMissingParameter, "there should be WHERE condition statement for DELETE operation", ) } // Soft deleting. if fieldNameDelete != "" { dataHolder, dataValue := m.softTimeMaintainer().GetDeleteData( ctx, "", fieldNameDelete, fieldTypeDelete, ) in := &HookUpdateInput{ internalParamHookUpdate: internalParamHookUpdate{ internalParamHook: internalParamHook{ link: m.getLink(true), }, handler: m.hookHandler.Update, }, Model: m, Table: m.tables, Schema: m.schema, Data: dataHolder, Condition: conditionStr, Args: append([]any{dataValue}, conditionArgs...), } return in.Next(ctx) } in := &HookDeleteInput{ internalParamHookDelete: internalParamHookDelete{ internalParamHook: internalParamHook{ link: m.getLink(true), }, handler: m.hookHandler.Delete, }, Model: m, Table: m.tables, Schema: m.schema, Condition: conditionStr, Args: conditionArgs, } return in.Next(ctx) }