1414 * See the License for the specific language governing permissions and
1515 * limitations under the License.
1616 */
17-
1817package gplus
1918
2019import (
2120 "database/sql"
22- "reflect"
23-
2421 "github.com/acmestack/gorm-plus/constants"
2522 "gorm.io/gorm"
2623 "gorm.io/gorm/schema"
2724 "gorm.io/gorm/utils"
25+ "reflect"
26+ "strings"
2827)
2928
3029var globalDb * gorm.DB
@@ -45,8 +44,7 @@ type Page[T any] struct {
4544type Dao [T any ] struct {}
4645
4746func (dao Dao [T ]) NewQuery () (* QueryCond [T ], * T ) {
48- q := & QueryCond [T ]{}
49- return q , nil
47+ return NewQuery [T ]()
5048}
5149
5250func NewPage [T any ](current , size int ) * Page [T ] {
@@ -268,8 +266,11 @@ func paginate[T any](p *Page[T]) func(db *gorm.DB) *gorm.DB {
268266
269267func buildCondition [T any ](q * QueryCond [T ], opts ... OptionFunc ) * gorm.DB {
270268 db := getDb (opts ... )
269+ // 这里清空参数,避免用户重复使用一个query条件
270+ q .queryArgs = make ([]any , 0 )
271271 resultDb := db .Model (new (T ))
272272 if q != nil {
273+
273274 if len (q .distinctColumns ) > 0 {
274275 resultDb .Distinct (q .distinctColumns )
275276 }
@@ -278,19 +279,11 @@ func buildCondition[T any](q *QueryCond[T], opts ...OptionFunc) *gorm.DB {
278279 resultDb .Select (q .selectColumns )
279280 }
280281
281- if q .queryBuilder .Len () > 0 {
282-
283- if q .andNestBuilder .Len () > 0 {
284- q .queryArgs = append (q .queryArgs , q .andNestArgs ... )
285- q .queryBuilder .WriteString (q .andNestBuilder .String ())
286- }
287-
288- if q .orNestBuilder .Len () > 0 {
289- q .queryArgs = append (q .queryArgs , q .orNestArgs ... )
290- q .queryBuilder .WriteString (q .orNestBuilder .String ())
291- }
292-
293- resultDb .Where (q .queryBuilder .String (), q .queryArgs ... )
282+ expressions := q .queryExpressions
283+ if len (expressions ) > 0 {
284+ var sqlBuilder strings.Builder
285+ q .queryArgs = buildSqlAndArgs [T ](expressions , & sqlBuilder , q .queryArgs )
286+ resultDb .Where (sqlBuilder .String (), q .queryArgs ... )
294287 }
295288
296289 if q .orderBuilder .Len () > 0 {
@@ -316,29 +309,31 @@ func buildCondition[T any](q *QueryCond[T], opts ...OptionFunc) *gorm.DB {
316309 return resultDb
317310}
318311
319- func getPkColumnName [T any ]() string {
320- var entity T
321- entityType := reflect .TypeOf (entity )
322- numField := entityType .NumField ()
323- var columnName string
324- for i := 0 ; i < numField ; i ++ {
325- field := entityType .Field (i )
326- tagSetting := schema .ParseTagSetting (field .Tag .Get ("gorm" ), ";" )
327- isPrimaryKey := utils .CheckTruth (tagSetting ["PRIMARYKEY" ], tagSetting ["PRIMARY_KEY" ])
328- if isPrimaryKey {
329- name , ok := tagSetting ["COLUMN" ]
330- if ! ok {
331- namingStrategy := schema.NamingStrategy {}
332- name = namingStrategy .ColumnName ("" , field .Name )
312+ func buildSqlAndArgs [T any ](expressions []any , sqlBuilder * strings.Builder , queryArgs []any ) []any {
313+ for _ , v := range expressions {
314+ // 判断是否是columnValue类型
315+ switch segment := v .(type ) {
316+ case * columnPointer :
317+ sqlBuilder .WriteString (segment .getSqlSegment () + " " )
318+ case * sqlKeyword :
319+ sqlBuilder .WriteString (segment .getSqlSegment () + " " )
320+ case * columnValue :
321+ if segment .value == constants .And {
322+ sqlBuilder .WriteString (segment .value .(string ) + " " )
323+ continue
333324 }
334- columnName = name
335- break
325+ if segment .value != "" {
326+ sqlBuilder .WriteString ("? " )
327+ queryArgs = append (queryArgs , segment .value )
328+ }
329+ case * QueryCond [T ]:
330+ sqlBuilder .WriteString (constants .LeftBracket + " " )
331+ // 递归处理条件
332+ queryArgs = buildSqlAndArgs [T ](segment .queryExpressions , sqlBuilder , queryArgs )
333+ sqlBuilder .WriteString (constants .RightBracket + " " )
336334 }
337335 }
338- if columnName == "" {
339- return constants .DefaultPrimaryName
340- }
341- return columnName
336+ return queryArgs
342337}
343338
344339func getDb (opts ... OptionFunc ) * gorm.DB {
@@ -359,6 +354,14 @@ func getDb(opts ...OptionFunc) *gorm.DB {
359354 return db
360355}
361356
357+ func getOption (opts []OptionFunc ) Option {
358+ var config Option
359+ for _ , op := range opts {
360+ op (& config )
361+ }
362+ return config
363+ }
364+
362365func setSelectIfNeed (option Option , db * gorm.DB ) {
363366 if len (option .Selects ) > 0 {
364367 var columnNames []string
@@ -381,10 +384,27 @@ func setOmitIfNeed(option Option, db *gorm.DB) {
381384 }
382385}
383386
384- func getOption (opts []OptionFunc ) Option {
385- var config Option
386- for _ , op := range opts {
387- op (& config )
387+ func getPkColumnName [T any ]() string {
388+ var entity T
389+ entityType := reflect .TypeOf (entity )
390+ numField := entityType .NumField ()
391+ var columnName string
392+ for i := 0 ; i < numField ; i ++ {
393+ field := entityType .Field (i )
394+ tagSetting := schema .ParseTagSetting (field .Tag .Get ("gorm" ), ";" )
395+ isPrimaryKey := utils .CheckTruth (tagSetting ["PRIMARYKEY" ], tagSetting ["PRIMARY_KEY" ])
396+ if isPrimaryKey {
397+ name , ok := tagSetting ["COLUMN" ]
398+ if ! ok {
399+ namingStrategy := schema.NamingStrategy {}
400+ name = namingStrategy .ColumnName ("" , field .Name )
401+ }
402+ columnName = name
403+ break
404+ }
388405 }
389- return config
406+ if columnName == "" {
407+ return constants .DefaultPrimaryName
408+ }
409+ return columnName
390410}
0 commit comments