Skip to content

查询

IBest-ORM 提供了强大的链式查询 API,支持各种复杂的查询场景。

检索单个对象

使用 first() 方法获取第一条记录:

ts
import { getORM } from '@ibestservices/ibest-orm';

const orm = getORM();

// 获取第一条记录
const user = orm.query(User).first();

// 带条件查询
const user = orm.query(User).where({ id: 1 }).first();

// 检查是否存在
if (user) {
  console.log('找到用户:', user.name);
}

检索全部对象

使用 find() 方法获取多条记录:

ts
// 获取所有记录
const users = orm.query(User).find();

// 带条件查询
const activeUsers = orm.query(User)
  .where({ status: 'active' })
  .find();

条件查询

对象风格条件

ts
// 等于
orm.query(User).where({ name: '张三' }).find();

// 多条件(AND)
orm.query(User).where({ name: '张三', age: 18 }).find();

// 比较操作符
orm.query(User).where({ age: { gt: 18 } }).find();      // age > 18
orm.query(User).where({ age: { gte: 18 } }).find();     // age >= 18
orm.query(User).where({ age: { lt: 30 } }).find();      // age < 30
orm.query(User).where({ age: { lte: 30 } }).find();     // age <= 30
orm.query(User).where({ age: { ne: 25 } }).find();      // age != 25

// 组合比较
orm.query(User).where({ age: { gte: 18, lte: 30 } }).find();  // 18 <= age <= 30

IN 查询

ts
// whereIn
orm.query(User).whereIn('id', [1, 2, 3]).find();

// whereNotIn
orm.query(User).whereNotIn('status', ['deleted', 'banned']).find();

NULL 查询

ts
// whereNull
orm.query(User).whereNull('deletedAt').find();

// whereNotNull
orm.query(User).whereNotNull('email').find();

BETWEEN 查询

ts
// whereBetween
orm.query(User).whereBetween('age', 18, 30).find();

// whereNotBetween
orm.query(User).whereNotBetween('age', 0, 17).find();

LIKE 查询

ts
// 模糊匹配
orm.query(User).whereLike('name', '张%').find();      // 以"张"开头
orm.query(User).whereLike('name', '%三').find();      // 以"三"结尾
orm.query(User).whereLike('name', '%张%').find();     // 包含"张"

OR 条件

ts
// orWhere
orm.query(User)
  .where({ status: 'active' })
  .orWhere({ vipLevel: { gt: 3 } })
  .find();
// WHERE status = 'active' OR vip_level > 3

选择字段

ts
// 选择特定字段
orm.query(User).select(['name', 'age']).find();

// 选择单个字段
orm.query(User).select(['name']).find();

排序

ts
// 升序
orm.query(User).orderBy('age', 'asc').find();

// 降序
orm.query(User).orderBy('createdAt', 'desc').find();

// 多字段排序
orm.query(User)
  .orderBy('status', 'asc')
  .orderBy('createdAt', 'desc')
  .find();

分页

ts
// limit
orm.query(User).limit(10).find();

// offset
orm.query(User).offset(20).find();

// 分页查询
const page = 2;
const pageSize = 10;
orm.query(User)
  .limit(pageSize)
  .offset((page - 1) * pageSize)
  .find();

分组

ts
// 按单字段分组
orm.query(User).groupBy('status').find();

// 按多字段分组
orm.query(User).groupBy('status').groupBy('role').find();

聚合查询

ts
// 计数
const count = orm.query(User).count();

// 带条件计数
const activeCount = orm.query(User)
  .where({ status: 'active' })
  .count();

// 检查是否存在
const exists = orm.query(User)
  .where({ email: 'test@example.com' })
  .exists();

软删除查询

对于配置了 @SoftDelete 的模型:

ts
// 默认查询(自动过滤已删除记录)
orm.query(Article).find();

// 包含已删除记录
orm.query(Article).withTrashed().find();

// 只查询已删除记录
orm.query(Article).onlyTrashed().find();

复杂查询示例

ts
// 综合查询示例
const users = orm.query(User)
  .select(['id', 'name', 'age', 'status'])
  .where({ status: 'active' })
  .where({ age: { gte: 18 } })
  .orWhere({ vipLevel: { gt: 5 } })
  .whereNotNull('email')
  .orderBy('createdAt', 'desc')
  .limit(20)
  .offset(0)
  .find();

查询缓存

ts
import { initQueryCache, getQueryCache } from '@ibestservices/ibest-orm';

// 初始化缓存
initQueryCache({ ttl: 60000 });  // 60秒过期

const cache = getQueryCache();

// 使用缓存
const cacheKey = 'active_users';
let users = cache.get(cacheKey);

if (!users) {
  users = orm.query(User).where({ status: 'active' }).find();
  cache.set(cacheKey, users);
}

// 清除缓存
cache.invalidate('user');  // 清除 user 表相关缓存
cache.clear();             // 清除所有缓存