Skip to content

Commit 27d4c11

Browse files
authored
Fix joins in db.Find(AndCount) (#28978)
1 parent 8ef53c8 commit 27d4c11

File tree

1 file changed

+21
-11
lines changed

1 file changed

+21
-11
lines changed

models/db/list.go

+21-11
Original file line numberDiff line numberDiff line change
@@ -133,27 +133,28 @@ type FindOptionsOrder interface {
133133

134134
// Find represents a common find function which accept an options interface
135135
func Find[T any](ctx context.Context, opts FindOptions) ([]*T, error) {
136-
sess := GetEngine(ctx)
136+
sess := GetEngine(ctx).Where(opts.ToConds())
137137

138-
if joinOpt, ok := opts.(FindOptionsJoin); ok && len(joinOpt.ToJoins()) > 0 {
138+
if joinOpt, ok := opts.(FindOptionsJoin); ok {
139139
for _, joinFunc := range joinOpt.ToJoins() {
140140
if err := joinFunc(sess); err != nil {
141141
return nil, err
142142
}
143143
}
144144
}
145+
if orderOpt, ok := opts.(FindOptionsOrder); ok {
146+
if order := orderOpt.ToOrders(); order != "" {
147+
sess.OrderBy(order)
148+
}
149+
}
145150

146-
sess = sess.Where(opts.ToConds())
147151
page, pageSize := opts.GetPage(), opts.GetPageSize()
148152
if !opts.IsListAll() && pageSize > 0 {
149153
if page == 0 {
150154
page = 1
151155
}
152156
sess.Limit(pageSize, (page-1)*pageSize)
153157
}
154-
if newOpt, ok := opts.(FindOptionsOrder); ok && newOpt.ToOrders() != "" {
155-
sess.OrderBy(newOpt.ToOrders())
156-
}
157158

158159
findPageSize := defaultFindSliceSize
159160
if pageSize > 0 {
@@ -168,8 +169,8 @@ func Find[T any](ctx context.Context, opts FindOptions) ([]*T, error) {
168169

169170
// Count represents a common count function which accept an options interface
170171
func Count[T any](ctx context.Context, opts FindOptions) (int64, error) {
171-
sess := GetEngine(ctx)
172-
if joinOpt, ok := opts.(FindOptionsJoin); ok && len(joinOpt.ToJoins()) > 0 {
172+
sess := GetEngine(ctx).Where(opts.ToConds())
173+
if joinOpt, ok := opts.(FindOptionsJoin); ok {
173174
for _, joinFunc := range joinOpt.ToJoins() {
174175
if err := joinFunc(sess); err != nil {
175176
return 0, err
@@ -178,7 +179,7 @@ func Count[T any](ctx context.Context, opts FindOptions) (int64, error) {
178179
}
179180

180181
var object T
181-
return sess.Where(opts.ToConds()).Count(&object)
182+
return sess.Count(&object)
182183
}
183184

184185
// FindAndCount represents a common findandcount function which accept an options interface
@@ -188,8 +189,17 @@ func FindAndCount[T any](ctx context.Context, opts FindOptions) ([]*T, int64, er
188189
if !opts.IsListAll() && pageSize > 0 && page >= 1 {
189190
sess.Limit(pageSize, (page-1)*pageSize)
190191
}
191-
if newOpt, ok := opts.(FindOptionsOrder); ok && newOpt.ToOrders() != "" {
192-
sess.OrderBy(newOpt.ToOrders())
192+
if joinOpt, ok := opts.(FindOptionsJoin); ok {
193+
for _, joinFunc := range joinOpt.ToJoins() {
194+
if err := joinFunc(sess); err != nil {
195+
return nil, 0, err
196+
}
197+
}
198+
}
199+
if orderOpt, ok := opts.(FindOptionsOrder); ok {
200+
if order := orderOpt.ToOrders(); order != "" {
201+
sess.OrderBy(order)
202+
}
193203
}
194204

195205
findPageSize := defaultFindSliceSize

0 commit comments

Comments
 (0)