Skip to content

Commit 6355289

Browse files
authored
fix: [#842] The paginate method will report an error when selecting and renaming only one column (#1325)
1 parent 9bad29e commit 6355289

4 files changed

Lines changed: 51 additions & 12 deletions

File tree

database/db/query.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@ import (
1818
"github.com/goravel/framework/database/utils"
1919
"github.com/goravel/framework/errors"
2020
"github.com/goravel/framework/support/carbon"
21+
"github.com/goravel/framework/support/collect"
2122
"github.com/goravel/framework/support/convert"
2223
"github.com/goravel/framework/support/deep"
2324
"github.com/goravel/framework/support/str"
@@ -711,6 +712,14 @@ func (r *Query) RightJoin(query string, args ...any) db.Query {
711712
func (r *Query) Select(columns ...string) db.Query {
712713
q := r.clone()
713714
q.conditions.Selects = deep.Append(q.conditions.Selects, columns...)
715+
q.conditions.Selects = collect.Unique(q.conditions.Selects)
716+
717+
// * may be added along with other columns, remove it.
718+
if len(q.conditions.Selects) > 1 {
719+
q.conditions.Selects = collect.Filter(q.conditions.Selects, func(column string, _ int) bool {
720+
return column != "*"
721+
})
722+
}
714723

715724
return q
716725
}

database/gorm/query.go

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ import (
2323
databasedriver "github.com/goravel/framework/database/driver"
2424
"github.com/goravel/framework/database/utils"
2525
"github.com/goravel/framework/errors"
26+
"github.com/goravel/framework/support/collect"
2627
"github.com/goravel/framework/support/database"
2728
"github.com/goravel/framework/support/deep"
2829
)
@@ -120,7 +121,7 @@ func (r *Query) Commit() error {
120121
}
121122

122123
func (r *Query) Count() (int64, error) {
123-
query := r.addGlobalScopes().buildConditions()
124+
query := r.resetSelect().addGlobalScopes().buildConditions()
124125

125126
var count int64
126127

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

623624
func (r *Query) Paginate(page, limit int, dest any, total *int64) error {
624-
query := r.dest(dest).addGlobalScopes().buildConditions()
625-
626625
offset := (page - 1) * limit
627626
if total != nil {
628-
if query.conditions.table == nil && query.conditions.model == nil {
629-
count, err := query.Model(dest).Count()
627+
if r.conditions.table == nil && r.conditions.model == nil {
628+
count, err := r.Model(dest).Count()
630629
if err != nil {
631630
return err
632631
}
633632
*total = count
634633
} else {
635-
count, err := query.Count()
634+
count, err := r.Count()
636635
if err != nil {
637636
return err
638637
}
639638
*total = count
640639
}
641640
}
642641

643-
return query.Offset(offset).Limit(limit).Find(dest)
642+
return r.Offset(offset).Limit(limit).Find(dest)
644643
}
645644

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

781780
func (r *Query) Select(columns ...string) contractsorm.Query {
782781
conditions := r.conditions
783-
conditions.selectColumns = columns
782+
conditions.selectColumns = append(conditions.selectColumns, columns...)
783+
conditions.selectColumns = collect.Unique(conditions.selectColumns)
784+
785+
// * may be added along with other columns, remove it.
786+
if len(conditions.selectColumns) > 1 {
787+
conditions.selectColumns = collect.Filter(conditions.selectColumns, func(column string, _ int) bool {
788+
return column != "*"
789+
})
790+
}
784791

785792
return r.setConditions(conditions)
786793
}
@@ -1783,6 +1790,13 @@ func (r *Query) refreshConnection() (*Query, error) {
17831790
return query, nil
17841791
}
17851792

1793+
func (r *Query) resetSelect() *Query {
1794+
conditions := r.conditions
1795+
conditions.selectColumns = nil
1796+
1797+
return r.setConditions(conditions)
1798+
}
1799+
17861800
func (r *Query) restored(dest any) error {
17871801
return r.event(contractsorm.EventRestored, r.conditions.model, dest)
17881802
}

tests/db_test.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -930,6 +930,15 @@ func (s *DBTestSuite) TestPaginate() {
930930
s.Equal(int64(5), total)
931931
s.Equal("paginate_product3", products[0].Name)
932932
s.Equal("paginate_product4", products[1].Name)
933+
934+
// Fix: https://github.com/goravel/goravel/issues/842
935+
products = []Product{}
936+
err = query.DB().Table("products").Select("name as name").WhereLike("name", "paginate_product%").Paginate(2, 2, &products, &total)
937+
s.NoError(err)
938+
s.Equal(2, len(products))
939+
s.Equal(int64(5), total)
940+
s.Equal("paginate_product3", products[0].Name)
941+
s.Equal("paginate_product4", products[1].Name)
933942
})
934943
}
935944
}

tests/query_test.go

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2785,26 +2785,33 @@ func (s *QueryTestSuite) TestPaginate() {
27852785
s.True(user3.ID > 0)
27862786

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

27912791
var users1 []User
27922792
var total1 int64
2793-
s.Nil(query.Query().Where("name = ?", "paginate_user").Paginate(2, 3, &users1, &total1))
2793+
s.Nil(query.Query().Where("name", "paginate_user").Paginate(2, 3, &users1, &total1))
27942794
s.Equal(1, len(users1))
27952795
s.Equal(int64(4), total1)
27962796

27972797
var users2 []User
27982798
var total2 int64
2799-
s.Nil(query.Query().Model(User{}).Where("name = ?", "paginate_user").Paginate(1, 3, &users2, &total2))
2799+
s.Nil(query.Query().Model(User{}).Where("name", "paginate_user").Paginate(1, 3, &users2, &total2))
28002800
s.Equal(3, len(users2))
28012801
s.Equal(int64(4), total2)
28022802

28032803
var users3 []User
28042804
var total3 int64
2805-
s.Nil(query.Query().Table("users").Where("name = ?", "paginate_user").Paginate(1, 3, &users3, &total3))
2805+
s.Nil(query.Query().Table("users").Where("name", "paginate_user").Paginate(1, 3, &users3, &total3))
28062806
s.Equal(3, len(users3))
28072807
s.Equal(int64(4), total3)
2808+
2809+
// Fix: https://github.com/goravel/goravel/issues/842
2810+
var users4 []User
2811+
var total4 int64
2812+
s.Nil(query.Query().Model(&User{}).Select("name as name").Where("name", "paginate_user").Paginate(1, 3, &users4, &total4))
2813+
s.Equal(3, len(users4))
2814+
s.Equal(int64(4), total4)
28082815
})
28092816
}
28102817
}

0 commit comments

Comments
 (0)