diff --git a/contracts/database/orm/orm.go b/contracts/database/orm/orm.go index 19364f9a2..fa15bc49d 100644 --- a/contracts/database/orm/orm.go +++ b/contracts/database/orm/orm.go @@ -139,6 +139,8 @@ type Query interface { WhereNotIn(column string, values []any) Query // WhereBetween adds a "where column between x and y" clause to the query. WhereBetween(column string, x, y any) Query + // WhereNotBetween adds a "where column not between x and y" clause to the query. + WhereNotBetween(column string, x, y any) Query // WithoutEvents disables event firing for the query. WithoutEvents() Query // WithTrashed allows soft deleted models to be included in the results. diff --git a/database/gorm/query.go b/database/gorm/query.go index 659b22736..f7fe78293 100644 --- a/database/gorm/query.go +++ b/database/gorm/query.go @@ -713,6 +713,10 @@ func (r *QueryImpl) WhereBetween(column string, x, y any) ormcontract.Query { return r.Where(fmt.Sprintf("%s BETWEEN %v AND %v", column, x, y)) } +func (r *QueryImpl) WhereNotBetween(column string, x, y any) ormcontract.Query { + return r.Where(fmt.Sprintf("%s NOT BETWEEN %v AND %v", column, x, y)) +} + func (r *QueryImpl) WithoutEvents() ormcontract.Query { return NewQueryImplByInstance(r.instance, &QueryImpl{ config: r.config, diff --git a/database/gorm/query_test.go b/database/gorm/query_test.go index 835a1420a..a3e03efeb 100644 --- a/database/gorm/query_test.go +++ b/database/gorm/query_test.go @@ -2881,6 +2881,33 @@ func (s *QueryTestSuite) TestWhereBetween() { } } +func (s *QueryTestSuite) TestWhereNotBetween() { + for driver, query := range s.queries { + s.Run(driver.String(), func() { + user := User{Name: "where_not_between_user", Avatar: "where_not_between_avatar"} + s.Nil(query.Create(&user)) + s.True(user.ID > 0) + + user1 := User{Name: "where_not_between_user", Avatar: "where_not_between_avatar_1"} + s.Nil(query.Create(&user1)) + s.True(user1.ID > 0) + + user2 := User{Name: "where_not_between_user", Avatar: "where_not_between_avatar_2"} + s.Nil(query.Create(&user2)) + s.True(user2.ID > 0) + + user3 := User{Name: "where_not_between_user", Avatar: "where_not_between_avatar_2"} + s.Nil(query.Create(&user3)) + s.True(user3.ID > 0) + + var users []User + s.Nil(query.Where("name = ?", "where_not_between_user").WhereNotBetween("id", user.ID, user2.ID).Find(&users)) + s.True(len(users) == 1) + s.True(users[0].ID == user3.ID) + }) + } +} + func (s *QueryTestSuite) TestWithoutEvents() { for _, query := range s.queries { tests := []struct { diff --git a/mocks/database/orm/Query.go b/mocks/database/orm/Query.go index 15f5d378d..40b396b62 100644 --- a/mocks/database/orm/Query.go +++ b/mocks/database/orm/Query.go @@ -920,6 +920,22 @@ func (_m *Query) WhereIn(column string, values []interface{}) orm.Query { return r0 } +// WhereNotBetween provides a mock function with given fields: column, x, y +func (_m *Query) WhereNotBetween(column string, x interface{}, y interface{}) orm.Query { + ret := _m.Called(column, x, y) + + var r0 orm.Query + if rf, ok := ret.Get(0).(func(string, interface{}, interface{}) orm.Query); ok { + r0 = rf(column, x, y) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(orm.Query) + } + } + + return r0 +} + // WhereNotIn provides a mock function with given fields: column, values func (_m *Query) WhereNotIn(column string, values []interface{}) orm.Query { ret := _m.Called(column, values) diff --git a/mocks/database/orm/Transaction.go b/mocks/database/orm/Transaction.go index a62c64e8a..032370d33 100644 --- a/mocks/database/orm/Transaction.go +++ b/mocks/database/orm/Transaction.go @@ -948,6 +948,22 @@ func (_m *Transaction) WhereIn(column string, values []interface{}) orm.Query { return r0 } +// WhereNotBetween provides a mock function with given fields: column, x, y +func (_m *Transaction) WhereNotBetween(column string, x interface{}, y interface{}) orm.Query { + ret := _m.Called(column, x, y) + + var r0 orm.Query + if rf, ok := ret.Get(0).(func(string, interface{}, interface{}) orm.Query); ok { + r0 = rf(column, x, y) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(orm.Query) + } + } + + return r0 +} + // WhereNotIn provides a mock function with given fields: column, values func (_m *Transaction) WhereNotIn(column string, values []interface{}) orm.Query { ret := _m.Called(column, values)