Skip to content

条件构建器参考

VEF Framework 查询条件构建器的完整方法参考。

基本条件

方法说明示例
Where(column, value)等于WHERE column = value
Where(column, op, value)带操作符WHERE column > value
WhereNot(column, value)不等于WHERE column <> value
WhereNull(column)为空WHERE column IS NULL
WhereNotNull(column)不为空WHERE column IS NOT NULL

范围条件

方法说明示例
WhereIn(column, values)包含WHERE column IN (...)
WhereNotIn(column, values)不包含WHERE column NOT IN (...)
WhereBetween(column, v1, v2)范围WHERE column BETWEEN v1 AND v2
WhereNotBetween(column, v1, v2)不在范围WHERE column NOT BETWEEN v1 AND v2

字符串匹配

方法说明示例
WhereLike(column, pattern)模糊匹配WHERE column LIKE pattern
WhereNotLike(column, pattern)不匹配WHERE column NOT LIKE pattern
WhereILike(column, pattern)不区分大小写WHERE LOWER(column) LIKE LOWER(pattern)

逻辑组合

方法说明示例
OrWhere(column, value)OR 条件OR column = value
OrWhereIn(column, values)OR INOR column IN (...)
WhereGroup(fn)条件分组AND (...)
OrWhereGroup(fn)OR 分组OR (...)

日期条件

方法说明示例
WhereDate(column, date)日期等于WHERE DATE(column) = date
WhereDateBetween(column, d1, d2)日期范围WHERE DATE(column) BETWEEN d1 AND d2
WhereYear(column, year)年份WHERE YEAR(column) = year
WhereMonth(column, month)月份WHERE MONTH(column) = month

子查询

方法说明
WhereExists(fn)EXISTS 子查询
WhereNotExists(fn)NOT EXISTS 子查询
WhereInSubquery(column, fn)IN 子查询

原始 SQL

方法说明
WhereRaw(sql, args...)原始 SQL 条件
OrWhereRaw(sql, args...)OR 原始 SQL

使用示例

go
q := orm.NewQuery[models.User]().
    Where("is_active", true).
    Where("age", ">=", 18).
    WhereIn("department_id", []string{"d1", "d2"}).
    WhereLike("username", "%john%").
    WhereGroup(func(q *orm.Query[models.User]) *orm.Query[models.User] {
        return q.Where("role", "admin").OrWhere("role", "manager")
    }).
    WhereNotNull("email").
    WhereDateBetween("created_at", "2024-01-01", "2024-12-31").
    OrderBy("created_at DESC").
    Limit(10)

users, err := q.Find()

查询方法

方法说明
Select(columns ...string)选择字段
Omit(columns ...string)排除字段
OrderBy(order string)排序
Limit(n int)限制数量
Offset(n int)偏移量
Preload(relations ...string)预加载关联
PreloadCondition(relation string, fn func(*gorm.DB) *gorm.DB)条件预加载

执行方法

方法说明
Find() ([]M, error)查询多条
First() (*M, error)查询第一条
Count() (int64, error)计数
Exists() (bool, error)是否存在
Paginate(page, pageSize int) ([]M, int64, error)分页查询

聚合方法

方法说明
Sum(column string) (float64, error)求和
Avg(column string) (float64, error)平均值
Max(column string) (interface{}, error)最大值
Min(column string) (interface{}, error)最小值

分组方法

方法说明
GroupBy(columns ...string)分组
Having(condition string, args ...interface{})分组条件

复杂查询示例

go
// Complex query with multiple conditions
q := orm.NewQuery[models.Order]().
    Select("id", "order_no", "amount", "status", "created_at").
    Where("status", "completed").
    Where("amount", ">=", 100).
    WhereGroup(func(q *orm.Query[models.Order]) *orm.Query[models.Order] {
        return q.
            Where("payment_method", "credit_card").
            OrWhere("payment_method", "paypal")
    }).
    WhereDateBetween("created_at", "2024-01-01", "2024-06-30").
    WhereNotNull("shipped_at").
    Preload("User", "Items").
    OrderBy("created_at DESC").
    Limit(100)

orders, err := q.Find()

// Aggregation query
totalAmount, err := orm.NewQuery[models.Order]().
    Where("status", "completed").
    WhereDateBetween("created_at", "2024-01-01", "2024-01-31").
    Sum("amount")

// Group by query
type SalesReport struct {
    Date       string  `json:"date"`
    TotalSales float64 `json:"totalSales"`
    OrderCount int64   `json:"orderCount"`
}

var report []SalesReport
orm.DB().Model(&models.Order{}).
    Select("DATE(created_at) as date, SUM(amount) as total_sales, COUNT(*) as order_count").
    Where("status = ?", "completed").
    Group("DATE(created_at)").
    Having("SUM(amount) > ?", 1000).
    Order("date DESC").
    Scan(&report)

子查询示例

go
// EXISTS subquery
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")
    })

// IN subquery
q := orm.NewQuery[models.Product]().
    WhereInSubquery("category_id", func(sq *gorm.DB) *gorm.DB {
        return sq.Table("categories").
            Select("id").
            Where("is_active = ?", true)
    })

// NOT EXISTS subquery
q := orm.NewQuery[models.User]().
    WhereNotExists(func(sq *gorm.DB) *gorm.DB {
        return sq.Table("orders").
            Where("orders.user_id = users.id").
            Where("orders.created_at > ?", time.Now().AddDate(0, -6, 0))
    })

基于 Apache License 2.0 许可发布