v0.1.1
Node.js Build / build (push) Successful in 6s
@windychen/trans-form-typeorm
TypeORM 适配包:把 @windychen/trans-form-middleware 解析出的结构化过滤器转为 FindOptionsWhere(对象式查询)或 QueryBuilder 条件(支持嵌套分组)。
版本 0.1.0 — 首个可发布版本:
toFindOptionsWhere/applyToQueryBuilder,覆盖 EQ/NE/GT/GTE/LT/LTE/LIKE/IN/NOT_IN/BETWEEN/IS_NULL/IS_NOT_NULL 全部操作符。
安装
npm install @windychen/trans-form-typeorm typeorm
用法
import { parseFilters } from '@windychen/trans-form-middleware';
import { toFindOptionsWhere, applyToQueryBuilder } from '@windychen/trans-form-typeorm';
// 1. middleware 解析
const filters = parseFilters(
[
{ field: 'name', value: 'xx', query: 'EQ' },
{ field: 'tags', value: 'a,b', query: 'IN', logic: 'OR' },
{ field: 'created', value: '2024-01-01,2024-12-31', query: 'BETWEEN', logic: 'AND' },
],
{ allowedFields: ['name', 'tags', 'created'] },
);
// 2a. FindOptionsWhere(repository.find)
const where = toFindOptionsWhere(filters);
// [{ name: Equal('xx') }, { tags: In(['a','b']), created: Between('2024-01-01','2024-12-31') }]
await repo.find({ where });
// 2b. QueryBuilder(支持嵌套分组)
const { qb, parameters } = applyToQueryBuilder(repo.createQueryBuilder('u'), filters, { alias: 'u' });
// u.name = :p1 OR (u.tags IN (:...p2) AND u.created BETWEEN :p3 AND :p4)
API
| 函数 | 说明 |
|---|---|
toFindOptionsWhere(filters, options?) |
→ FindOptionsWhere[]。支持深层 OR 嵌套(递归 + 分配律展开):AND 项合并进同一对象,OR 项拆成数组元素,X AND (A OR B) 自动展开为 [{X,A},{X,B}] |
applyToQueryBuilder(qb, filters, options?) |
→ { qb, parameters }。支持嵌套分组括号表达式、参数绑定、alias 前缀 |
mapOperator(query, operatorMap?) |
操作符码 → 工厂函数 |
DEFAULT_OPERATOR_MAP |
默认操作符映射表 |
深层 OR 嵌套(toFindOptionsWhere)
输入支持 toTree 输出的嵌套结构({ logic, children }),自动展开:
| 逻辑 | 输出 |
|---|---|
A OR B |
[{A}, {B}] |
X AND (A OR B) |
[{X,A}, {X,B}](分配律) |
(A OR B) AND (C OR D) |
[{A,C},{A,D},{B,C},{B,D}](笛卡尔积) |
A OR (B AND C) |
[{A}, {B,C}] |
同字段 AND(name='a' AND name LIKE 'b') |
And(Equal('a'), Like('b')) |
注意:分配律展开在最坏情况下呈指数增长(每组 OR 分支相乘)。实际查询条件数量有限,可放心使用;极端复杂的布尔树建议走
applyToQueryBuilder(括号表达式,无展开成本)。
选项
toFindOptionsWhere:{ skipFlags = ['disabled','hidden'], skipEmpty = false, operatorMap }
applyToQueryBuilder:{ skipFlags = ['disabled','hidden'], skipEmpty = false, operatorMap, alias = '', paramPrefix = 'p', method = 'andWhere' }
method:'where' | 'andWhere' | 'orWhere',首条件挂载方式- 空 value 且非 IS_NULL/IS_NOT_NULL 的条件自动跳过;LIKE 值自动加
%
操作符映射
| query | FindOptionsWhere | SQL |
|---|---|---|
| EQ | Equal(v) |
= :p |
| NE | Not(Equal(v)) |
<> :p |
| GT | MoreThan(v) |
> :p |
| GTE | MoreThanOrEqual(v) |
>= :p |
| LT | LessThan(v) |
< :p |
| LTE | LessThanOrEqual(v) |
<= :p |
| LIKE | Like(v) |
LIKE :p(自动加 %) |
| IN | In(values) |
IN (:...p) |
| NOT_IN | Not(In(values)) |
NOT IN (:...p) |
| BETWEEN | Between(a, b) |
BETWEEN :p1 AND :p2 |
| IS_NULL | IsNull() |
IS NULL |
| IS_NOT_NULL | Not(IsNull()) |
IS NOT NULL |
依赖
零运行时依赖;typeorm 为 peerDependency(^0.3.0)。
相关包
@windychen/trans-form-component— Vue 3 动态查询表单(schema 入 → filters 出)@windychen/trans-form-middleware— 结构化过滤器解析(不碰 SQL)
Description
TypeORM adapter for @windychen/trans-form-middleware: structured filters to FindOptionsWhere / QueryBuilder