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))
    })