Skip to content

搜索标签

VEF Framework 支持通过 struct tag 定义搜索条件,自动将搜索参数转换为数据库查询。

基本用法

定义搜索参数

go
type UserSearch struct {
    Username     string `search:"like"`           // LIKE '%value%'
    Email        string `search:"eq"`             // = value
    IsActive     *bool  `search:"eq"`             // = value (pointer for optional)
    DepartmentId string `search:"eq"`             // = value
    CreatedAt    string `search:"gte" column:"created_at"` // >= value
}

使用搜索参数

go
// In API definition
apis.NewFindPageApi[models.User, UserSearch]()

// Request
{
    "resource": "smp/sys/user",
    "action": "find_page",
    "params": {
        "username": "john",
        "isActive": true
    }
}

// Generated SQL
// SELECT * FROM users WHERE username LIKE '%john%' AND is_active = true

支持的操作符

操作符说明SQL
eq等于= value
ne不等于<> value
gt大于> value
gte大于等于>= value
lt小于< value
lte小于等于<= value
like模糊匹配LIKE '%value%'
likeLeft左模糊LIKE '%value'
likeRight右模糊LIKE 'value%'
in包含IN (values)
notIn不包含NOT IN (values)
between范围BETWEEN v1 AND v2
isNull为空IS NULL
isNotNull不为空IS NOT NULL

高级用法

指定列名

go
type UserSearch struct {
    // Field name differs from column name
    Name string `search:"like" column:"username"`
}

多字段搜索

go
type UserSearch struct {
    // Search in multiple columns
    Keyword string `search:"like" columns:"username,email,phone"`
}

日期范围搜索

go
type OrderSearch struct {
    StartDate string `search:"gte" column:"created_at"`
    EndDate   string `search:"lte" column:"created_at"`
}

可选字段

go
type UserSearch struct {
    // Use pointer for optional fields
    IsActive *bool   `search:"eq"`
    Role     *string `search:"eq"`
}

自定义搜索逻辑

忽略空值

go
type UserSearch struct {
    Username string `search:"like" ignoreEmpty:"true"`
    Email    string `search:"eq" ignoreEmpty:"true"`
}

自定义条件

go
type UserSearch struct {
    Keyword string `search:"-"` // Ignore in auto search
}

// Handle manually in API
apis.NewFindPageApi[models.User, UserSearch]().
    WithDynamicCondition(func(ctx fiber.Ctx, search UserSearch) func(q *orm.Query[models.User]) *orm.Query[models.User] {
        return func(q *orm.Query[models.User]) *orm.Query[models.User] {
            if search.Keyword != "" {
                q = q.WhereGroup(func(q *orm.Query[models.User]) *orm.Query[models.User] {
                    return q.
                        WhereLike("username", "%"+search.Keyword+"%").
                        OrWhereLike("email", "%"+search.Keyword+"%").
                        OrWhereLike("phone", "%"+search.Keyword+"%")
                })
            }
            return q
        }
    })

关联表搜索

搜索关联字段

go
type UserSearch struct {
    DepartmentName string `search:"like" column:"Department.name" join:"Department"`
}

嵌套关联搜索

go
type UserSearch struct {
    CompanyName string `search:"like" column:"Department.Company.name" join:"Department.Company"`
}

完整示例

go
package payloads

// UserSearch defines search parameters for user queries
type UserSearch struct {
    // Basic fields
    Username     string  `search:"like"`
    Email        string  `search:"like"`
    Phone        string  `search:"like"`
    
    // Exact match
    DepartmentId string  `search:"eq"`
    Role         string  `search:"eq"`
    
    // Boolean (use pointer for optional)
    IsActive     *bool   `search:"eq"`
    IsAdmin      *bool   `search:"eq"`
    
    // Range
    AgeMin       *int    `search:"gte" column:"age"`
    AgeMax       *int    `search:"lte" column:"age"`
    
    // Date range
    CreatedFrom  string  `search:"gte" column:"created_at"`
    CreatedTo    string  `search:"lte" column:"created_at"`
    
    // IN condition
    Ids          []string `search:"in" column:"id"`
    Statuses     []string `search:"in" column:"status"`
    
    // Custom keyword search (handled manually)
    Keyword      string  `search:"-"`
    
    // Pagination (not search conditions)
    Page         int     `search:"-"`
    PageSize     int     `search:"-"`
    
    // Sorting (not search conditions)
    SortField    string  `search:"-"`
    SortOrder    string  `search:"-"`
}

搜索标签参考

标签说明示例
search:"eq"等于WHERE column = value
search:"ne"不等于WHERE column <> value
search:"gt"大于WHERE column > value
search:"gte"大于等于WHERE column >= value
search:"lt"小于WHERE column < value
search:"lte"小于等于WHERE column <= value
search:"like"模糊匹配WHERE column LIKE '%value%'
search:"likeLeft"左模糊WHERE column LIKE '%value'
search:"likeRight"右模糊WHERE column LIKE 'value%'
search:"in"包含WHERE column IN (values)
search:"notIn"不包含WHERE column NOT IN (values)
search:"between"范围WHERE column BETWEEN v1 AND v2
search:"isNull"为空WHERE column IS NULL
search:"isNotNull"不为空WHERE column IS NOT NULL
search:"-"忽略不生成条件
附加标签说明
column:"name"指定数据库列名
columns:"a,b,c"多列搜索(OR)
ignoreEmpty:"true"忽略空值
join:"Relation"关联表搜索

下一步

基于 Apache License 2.0 许可发布