Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions database/db/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import (
"github.com/goravel/framework/database/utils"
"github.com/goravel/framework/errors"
"github.com/goravel/framework/support/carbon"
"github.com/goravel/framework/support/collect"
"github.com/goravel/framework/support/convert"
"github.com/goravel/framework/support/deep"
"github.com/goravel/framework/support/str"
Expand Down Expand Up @@ -711,6 +712,14 @@ func (r *Query) RightJoin(query string, args ...any) db.Query {
func (r *Query) Select(columns ...string) db.Query {
q := r.clone()
q.conditions.Selects = deep.Append(q.conditions.Selects, columns...)
q.conditions.Selects = collect.Unique(q.conditions.Selects)

// * may be added along with other columns, remove it.
if len(q.conditions.Selects) > 1 {
q.conditions.Selects = collect.Filter(q.conditions.Selects, func(column string, _ int) bool {
return column != "*"
})
}

return q
}
Expand Down
30 changes: 22 additions & 8 deletions database/gorm/query.go
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ import (
databasedriver "github.com/goravel/framework/database/driver"
"github.com/goravel/framework/database/utils"
"github.com/goravel/framework/errors"
"github.com/goravel/framework/support/collect"
"github.com/goravel/framework/support/database"
"github.com/goravel/framework/support/deep"
)
Expand Down Expand Up @@ -120,7 +121,7 @@ func (r *Query) Commit() error {
}

func (r *Query) Count() (int64, error) {
query := r.addGlobalScopes().buildConditions()
query := r.resetSelect().addGlobalScopes().buildConditions()

var count int64

Expand Down Expand Up @@ -621,26 +622,24 @@ func (r *Query) OrWhere(query any, args ...any) contractsorm.Query {
}

func (r *Query) Paginate(page, limit int, dest any, total *int64) error {
query := r.dest(dest).addGlobalScopes().buildConditions()

offset := (page - 1) * limit
if total != nil {
if query.conditions.table == nil && query.conditions.model == nil {
count, err := query.Model(dest).Count()
if r.conditions.table == nil && r.conditions.model == nil {
count, err := r.Model(dest).Count()
if err != nil {
return err
}
*total = count
} else {
count, err := query.Count()
count, err := r.Count()
if err != nil {
return err
}
*total = count
}
}

return query.Offset(offset).Limit(limit).Find(dest)
return r.Offset(offset).Limit(limit).Find(dest)
}

func (r *Query) Pluck(column string, dest any) error {
Expand Down Expand Up @@ -780,7 +779,15 @@ func (r *Query) Scopes(funcs ...func(contractsorm.Query) contractsorm.Query) con

func (r *Query) Select(columns ...string) contractsorm.Query {
conditions := r.conditions
conditions.selectColumns = columns
conditions.selectColumns = append(conditions.selectColumns, columns...)
conditions.selectColumns = collect.Unique(conditions.selectColumns)
Comment thread
hwbrzzl marked this conversation as resolved.

// * may be added along with other columns, remove it.
if len(conditions.selectColumns) > 1 {
conditions.selectColumns = collect.Filter(conditions.selectColumns, func(column string, _ int) bool {
return column != "*"
})
}

return r.setConditions(conditions)
}
Expand Down Expand Up @@ -1783,6 +1790,13 @@ func (r *Query) refreshConnection() (*Query, error) {
return query, nil
}

func (r *Query) resetSelect() *Query {
conditions := r.conditions
conditions.selectColumns = nil

return r.setConditions(conditions)
}

func (r *Query) restored(dest any) error {
return r.event(contractsorm.EventRestored, r.conditions.model, dest)
}
Expand Down
9 changes: 9 additions & 0 deletions tests/db_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -930,6 +930,15 @@ func (s *DBTestSuite) TestPaginate() {
s.Equal(int64(5), total)
s.Equal("paginate_product3", products[0].Name)
s.Equal("paginate_product4", products[1].Name)

// Fix: https://github.com/goravel/goravel/issues/842
products = []Product{}
err = query.DB().Table("products").Select("name as name").WhereLike("name", "paginate_product%").Paginate(2, 2, &products, &total)
s.NoError(err)
s.Equal(2, len(products))
s.Equal(int64(5), total)
s.Equal("paginate_product3", products[0].Name)
s.Equal("paginate_product4", products[1].Name)
})
}
}
Expand Down
15 changes: 11 additions & 4 deletions tests/query_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -2785,26 +2785,33 @@ func (s *QueryTestSuite) TestPaginate() {
s.True(user3.ID > 0)

var users []User
s.Nil(query.Query().Where("name = ?", "paginate_user").Paginate(1, 3, &users, nil))
s.Nil(query.Query().Where("name", "paginate_user").Paginate(1, 3, &users, nil))
s.Equal(3, len(users))

var users1 []User
var total1 int64
s.Nil(query.Query().Where("name = ?", "paginate_user").Paginate(2, 3, &users1, &total1))
s.Nil(query.Query().Where("name", "paginate_user").Paginate(2, 3, &users1, &total1))
s.Equal(1, len(users1))
s.Equal(int64(4), total1)

var users2 []User
var total2 int64
s.Nil(query.Query().Model(User{}).Where("name = ?", "paginate_user").Paginate(1, 3, &users2, &total2))
s.Nil(query.Query().Model(User{}).Where("name", "paginate_user").Paginate(1, 3, &users2, &total2))
s.Equal(3, len(users2))
s.Equal(int64(4), total2)

var users3 []User
var total3 int64
s.Nil(query.Query().Table("users").Where("name = ?", "paginate_user").Paginate(1, 3, &users3, &total3))
s.Nil(query.Query().Table("users").Where("name", "paginate_user").Paginate(1, 3, &users3, &total3))
s.Equal(3, len(users3))
s.Equal(int64(4), total3)

// Fix: https://github.com/goravel/goravel/issues/842
var users4 []User
var total4 int64
s.Nil(query.Query().Model(&User{}).Select("name as name").Where("name", "paginate_user").Paginate(1, 3, &users4, &total4))
s.Equal(3, len(users4))
s.Equal(int64(4), total4)
})
}
}
Expand Down
Loading