Skip to content

条件构建器

VEF Framework 提供了丰富的条件构建器方法,用于构建复杂的查询条件。

基本条件方法

相等条件

go
import "github.com/ilxqx/vef-framework-go/orm"

// Where equal
q := orm.NewQuery[models.User]().
    Where("username", "john")

// Where with operator
q := orm.NewQuery[models.User]().
    Where("age", ">", 18)

不等条件

go
q := orm.NewQuery[models.User]().
    WhereNot("status", "deleted")

// Or using operator
q := orm.NewQuery[models.User]().
    Where("status", "<>", "deleted")

NULL 条件

go
// IS NULL
q := orm.NewQuery[models.User]().
    WhereNull("deleted_at")

// IS NOT NULL
q := orm.NewQuery[models.User]().
    WhereNotNull("email")

范围条件

IN 条件

go
q := orm.NewQuery[models.User]().
    WhereIn("id", []string{"id1", "id2", "id3"})

// NOT IN
q := orm.NewQuery[models.User]().
    WhereNotIn("status", []string{"deleted", "banned"})

BETWEEN 条件

go
q := orm.NewQuery[models.User]().
    WhereBetween("age", 18, 65)

// Date range
q := orm.NewQuery[models.User]().
    WhereBetween("created_at", startDate, endDate)

字符串匹配

LIKE 条件

go
// Contains
q := orm.NewQuery[models.User]().
    WhereLike("username", "%john%")

// Starts with
q := orm.NewQuery[models.User]().
    WhereLike("email", "admin%")

// Ends with
q := orm.NewQuery[models.User]().
    WhereLike("email", "%@example.com")

不区分大小写匹配

go
q := orm.NewQuery[models.User]().
    WhereILike("username", "%john%")

逻辑组合

OR 条件

go
q := orm.NewQuery[models.User]().
    Where("status", "active").
    OrWhere("is_admin", true)

// SQL: WHERE status = 'active' OR is_admin = true

条件分组

go
q := orm.NewQuery[models.User]().
    Where("is_active", true).
    WhereGroup(func(q *orm.Query[models.User]) *orm.Query[models.User] {
        return q.Where("role", "admin").OrWhere("role", "manager")
    })

// SQL: WHERE is_active = true AND (role = 'admin' OR role = 'manager')

复杂条件组合

go
q := orm.NewQuery[models.User]().
    Where("department_id", deptId).
    WhereGroup(func(q *orm.Query[models.User]) *orm.Query[models.User] {
        return q.
            WhereGroup(func(q *orm.Query[models.User]) *orm.Query[models.User] {
                return q.Where("role", "admin").Where("level", ">", 5)
            }).
            OrWhereGroup(func(q *orm.Query[models.User]) *orm.Query[models.User] {
                return q.Where("is_super", true)
            })
    })

// SQL: WHERE department_id = ? AND ((role = 'admin' AND level > 5) OR (is_super = true))

日期条件

日期比较

go
q := orm.NewQuery[models.User]().
    WhereDate("created_at", "2024-01-01")

// SQL: WHERE DATE(created_at) = '2024-01-01'

日期范围

go
q := orm.NewQuery[models.User]().
    WhereDateBetween("created_at", "2024-01-01", "2024-12-31")

// SQL: WHERE DATE(created_at) BETWEEN '2024-01-01' AND '2024-12-31'

时间段查询

go
// Today
q := orm.NewQuery[models.User]().
    WhereDate("created_at", time.Now().Format("2006-01-02"))

// This month
q := orm.NewQuery[models.User]().
    WhereMonth("created_at", time.Now().Month()).
    WhereYear("created_at", time.Now().Year())

JSON 字段条件

JSON 路径查询

go
// Query JSON field
q := orm.NewQuery[models.User]().
    WhereJsonContains("settings", "notifications", true)

// SQL: WHERE JSON_CONTAINS(settings, 'true', '$.notifications')

JSON 数组查询

go
q := orm.NewQuery[models.User]().
    WhereJsonContains("tags", "vip")

// SQL: WHERE JSON_CONTAINS(tags, '"vip"')

子查询条件

EXISTS 子查询

go
q := orm.NewQuery[models.User]().
    WhereExists(func(sq *gorm.DB) *gorm.DB {
        return sq.Table("orders").
            Where("orders.user_id = users.id").
            Where("orders.status = ?", "completed")
    })

// SQL: WHERE EXISTS (SELECT 1 FROM orders WHERE orders.user_id = users.id AND orders.status = 'completed')

IN 子查询

go
q := orm.NewQuery[models.User]().
    WhereInSubquery("department_id", func(sq *gorm.DB) *gorm.DB {
        return sq.Table("departments").
            Select("id").
            Where("is_active = ?", true)
    })

// SQL: WHERE department_id IN (SELECT id FROM departments WHERE is_active = true)

原始 SQL 条件

使用原始 SQL

go
q := orm.NewQuery[models.User]().
    WhereRaw("YEAR(created_at) = ?", 2024)

// SQL: WHERE YEAR(created_at) = 2024

复杂原始条件

go
q := orm.NewQuery[models.User]().
    WhereRaw("(age > ? AND status = ?) OR is_vip = ?", 18, "active", true)

条件构建器方法参考

方法说明
Where(column, value)等于条件
Where(column, op, value)带操作符的条件
WhereNot(column, value)不等于条件
WhereNull(column)IS NULL
WhereNotNull(column)IS NOT NULL
WhereIn(column, values)IN 条件
WhereNotIn(column, values)NOT IN 条件
WhereBetween(column, v1, v2)BETWEEN 条件
WhereLike(column, pattern)LIKE 条件
WhereILike(column, pattern)不区分大小写 LIKE
OrWhere(column, value)OR 条件
WhereGroup(fn)条件分组
WhereRaw(sql, args...)原始 SQL 条件
WhereExists(fn)EXISTS 子查询
WhereDate(column, date)日期条件
WhereDateBetween(column, d1, d2)日期范围

下一步

基于 Apache License 2.0 许可发布