@@ -452,6 +452,63 @@ func (t *Table) UpdateById(id any, values map[string]any) (rows int64, err error
452452 return res .RowsAffected ()
453453}
454454
455+ func (t * Table ) UpdateByIdEx (id any , filter map [string ]any , values map [string ]any ) (rows int64 , err error ) {
456+ for _ , column := range t .Columns {
457+ if column .Updated {
458+ values [column .Name ] = time .Now ().Format (time .DateTime ) //直接格式化
459+ }
460+
461+ if column .Json {
462+ if val , ok := values [column .Name ]; ok {
463+ values [column .Name ], _ = json .Marshal (val )
464+ }
465+ }
466+ }
467+
468+ if t .BeforeUpdate != nil {
469+ err = t .BeforeUpdate (id , values )
470+ if err != nil {
471+ return
472+ }
473+ }
474+
475+ var updates []builder.Cond
476+ for k , v := range values {
477+ updates = append (updates , builder.Eq {db .Engine ().Quote (k ): v })
478+ }
479+ bdr := builder .Dialect (db .Engine ().DriverName ()).Update (updates ... ).From (db .Engine ().Quote (t .Name ))
480+
481+ //bdr.Where(builder.Eq{"id": id})
482+ cs , err := t .condId (id )
483+ if err != nil {
484+ return 0 , err
485+ }
486+ for _ , c := range cs {
487+ bdr .Where (c )
488+ }
489+
490+ if len (filter ) > 0 {
491+ cs , err = t .condWhere (filter , false )
492+ if err != nil {
493+ return 0 , err
494+ }
495+ for _ , c := range cs {
496+ bdr .Where (c )
497+ }
498+ }
499+
500+ res , err := db .Engine ().ID (id ).Exec (bdr )
501+ if err != nil {
502+ return 0 , err
503+ }
504+
505+ if t .AfterUpdate != nil {
506+ err = t .AfterUpdate (id , values , values )
507+ }
508+
509+ return res .RowsAffected ()
510+ }
511+
455512func (t * Table ) Delete (filter map [string ]any ) (rows int64 , err error ) {
456513 cs , err := t .condWhere (filter , false )
457514 if err != nil {
@@ -501,6 +558,49 @@ func (t *Table) DeleteById(id any) (rows int64, err error) {
501558 return res .RowsAffected ()
502559}
503560
561+ func (t * Table ) DeleteByIdEx (id any , filter map [string ]any ) (rows int64 , err error ) {
562+ bdr := builder .Dialect (db .Engine ().DriverName ()).Delete ().From (db .Engine ().Quote (t .Name ))
563+
564+ if t .BeforeDelete != nil {
565+ err = t .BeforeDelete (id )
566+ if err != nil {
567+ return
568+ }
569+ }
570+
571+ cs , err := t .condId (id )
572+ if err != nil {
573+ return 0 , err
574+ }
575+ for _ , c := range cs {
576+ bdr .Where (c )
577+ }
578+
579+ if len (filter ) > 0 {
580+ cs , err = t .condWhere (filter , false )
581+ if err != nil {
582+ return 0 , err
583+ }
584+ for _ , c := range cs {
585+ bdr .Where (c )
586+ }
587+ }
588+
589+ res , err := db .Engine ().Exec (bdr )
590+ if err != nil {
591+ return 0 , err
592+ }
593+
594+ if t .AfterDelete != nil {
595+ err = t .AfterDelete (id , nil )
596+ if err != nil {
597+ return 0 , err
598+ }
599+ }
600+
601+ return res .RowsAffected ()
602+ }
603+
504604func (t * Table ) Find (body * ParamSearch ) (rows []map [string ]any , err error ) {
505605 columns := body .Fields
506606 if len (columns ) == 0 {
0 commit comments