Home

Awesome

@aijs/apijson-builder

fork自https://github.com/pengxianggui/apijson-builder
简单包装apijson,相比直接构造查询json更好记一些,使用ts编写,并且调整了一些参数和使用方式

简单查询

分页

await QueryBuilder
    // 指定要查询的表
    .by({ table: 表名称 })
    // 需要注意分页是从0开始
    .page(0, 20)
    .send();

获取多条数据

await QueryBuilder
    // 指定要查询的表
    .by({ table: 表名称 })
    // 默认多个条件 && 
    .condition(Condition.eq(字段名1, 值1))
    .condition(Condition.eq(字段名2, 值2))
    // 获取符合条件的多条数据,true默认10条
    .multi(true)
    // 可以指定条数
    // .multi(5)
    .send();

调试

await QueryBuilder
    // 指定要查询的表
    .by({ table: 表名称 })
    .debug(true)
    // 需要注意分页是从0开始
    .page(0, 20)
    .send();

搜索+分页

await QueryBuilder
    // 指定要查询的表
    .by({ table: 表名称 })
    // 查询字段名=值的数据
    .condition(Condition.eq(字段名, 值))
    // 带查询条件并分页返回,需要注意分页是从0开始
    .page(0, 20)
    .send();

模糊搜索

await QueryBuilder
    // 指定要查询的表
    .by({ table: 表名称 })
    // 查询字段名=值的数据
    .condition(Condition.like(字段名, 值))
    // 带查询条件并分页返回,需要注意分页是从0开始
    .page(0, 20)
    .send();

排序

await QueryBuilder
    // 指定要查询的表
    .by({ table: 表名称 })
    // 降序desc
    .order('create_time', true)
    // 或者增序asc
    .order('update_time', false)
    // 带查询条件并分页返回,需要注意分页是从0开始
    .page(0, 20)
    .send();

多个条件

await QueryBuilder
    // 指定要查询的表
    .by({ table: 表名称 })
    // 默认多个条件 && 
    .condition(Condition.eq(字段名1, 值1))
    .condition(Condition.eq(字段名2, 值2))
    // 获取符合条件的分页
    .page(0, 20)
    .send();

多个条件and/or

await QueryBuilder
    // 指定要查询的表
    .by({ table: 表名称 })
    // 这样返回符合 字段名1=值1 || 字段名2=值2
    .condition(Condition.eq(字段名1, 值1, true))
    .condition(Condition.eq(字段名2, 值2, true))
    .send();

// 这样返回符合 (字段名3=值3 && 字段名4=值4) && (字段名1=值1 || 字段名2=值2)
await QueryBuilder
    .by({ table: 表名称 })
    .condition(Condition.eq(字段名1, 值1, true))
    .condition(Condition.eq(字段名2, 值2, true))
    .condition(Condition.eq(字段名3, 值3))
    .condition(Condition.eq(字段名4, 值4))
    .send();

获取指定字段

不指定字段默认*获取所有字段,如果指定字段默认会附加id

await QueryBuilder
    .by({ table: 表名称 })
    .get(字段名1)
    .get(字段名2)
    .page(0, 20)
    .send();
// 或者
await QueryBuilder
    .by({ table: 表名称 })
    .get([字段名1, 字段名2])
    .get(字段名3)
    .page(0, 20)
    .send();

单表新增

await CrudBuilder
    .post(表名称)
    .set(字段1, 值1)
    .set(字段2, 值2)
    .send();
// 或者
await CrudBuilder
    .post(表名称)
    .setData({
        字段1: 值1,
        字段2: 值2,
    })
    .send();
await CrudBuilder
    .by({ table: 表名称, method: 'post' })
    .setData({
        字段1: 值1,
        字段2: 值2,
    })
    .send();

单表根据id删除

await CrudBuilder
    .delete(表名称)
    .id(id)
    .send();
// 或者批量删除
await CrudBuilder
    .delete(表名称)
    .id([id1, id2])
    .send();
// 或者批量删除
await CrudBuilder
    .delete(表名称)
    .id(id1)
    .id(id2)
    .send();
await CrudBuilder
    .by({ table: 表名称, method: 'delete' })
    .id(id)
    .send();

单表根据id修改

await CrudBuilder
    .put(表名称)
    .id(id)
    .set(字段1, 值1)
    .set(字段2, 值2)
    .send();
// 或者
await CrudBuilder
    .put(表名称)
    .id(id)
    .setData({
        字段1: 值1,
        字段2: 值2,
    })
    .send();
// 或者
await CrudBuilder
    .by({ table: 表名称, method: 'put' })
    .id(id)
    .setData({
        字段1: 值1,
        字段2: 值2,
    })
    .send();

一对一

await QueryBuilder
    .by({ table: 主表名称 })
    .debug(true)
    .condition(Condition.eq('id', 2))
    // 可以接多个child以查询多张子表
    .child(AssociativeCondition.by({
        primaryKey: 主表字段,
        table: 子表名称,
        foreignKey: 子表字段
    }))
    .send();
// 或者
await QueryBuilder
    .by({ table: 主表名称 })
    .debug(true)
    .condition(Condition.eq('id', 2))
    // 可以接多个child以查询多张子表
    .child(
        AssociativeCondition
            .table(子表名称)
            .link(主表字段, 子表字段)
    )
    .child(
        AssociativeCondition
            .table(子表名称2)
            .link(主表字段2, 子表字段2)
    )
    .send();
// => 得到的json如下
const json = {
    'Test_a2': {
        'id': 2
    },
    'Test_a1': {
        'column1@': '/Test_a2/column1'
    },
    '@explain': true
};

一对多

await QueryBuilder
    .by({ table: 主表名称 })
    .debug(true)
    .condition(Condition.eq('id', 2))
    // 可以接多个children以查询多张子表
    .children(AssociativeCondition.by({
        primaryKey: 主表字段,
        table: 子表名称,
        foreignKey: 子表字段
    }))
    .send();
// 或者
await QueryBuilder
    .by({ table: 主表名称 })
    .debug(true)
    .condition(Condition.eq('id', 2))
    // 可以接多个children以查询多张子表
    .children(
        AssociativeCondition
            .table(子表名称)
            .link(主表字段, 子表字段)
    )
    .children(
        AssociativeCondition
            .table(子表名称2)
            .link(主表字段2, 子表字段2)
    )
    .send();
// => 得到的json如下
const json = {
    'Test_a2': {
        'id': 2
    },
    '[]': {
        'Test_a1': {
            'column1@': 'Test_a2/column1'
        }
    },
    // 多张一对多子表会使用别名
    '[]:Test_a21': {
        'Test_a21': {
            'column1@': 'Test_a2/column1'
        },
        'count': 100
    },
    '@explain': true
};

一对一,一对多指定查询字段

不指定字段默认*,如果指定字段默认会附加id

await QueryBuilder
    .by({ table: 主表名称 })
    .debug(true)
    .condition(Condition.eq('id', 2))
    // 可以接多个children以查询多张子表
    .children(
        AssociativeCondition
            .table(子表名称)
            .link(主表字段, 子表字段)
            .get([字段1, 字段2])
    )
    .send();

join连表

注意join连表即使不.page(0,10)也一定是查询多条数据结果

await QueryBuilder
    .by({ table: 主表名称 })
    .debug(true)
    .condition(Condition.eq('id', 2))
    .join(
        AssociativeCondition
            .table(子表名称)
            .leftJoin(主表字段, 子表字段)
            .get([字段1, 字段2])
    )
    .page(0, 10)
    .send();
// 使用关联表
await QueryBuilder
    .by({ table: 主表名称 })
    .debug(true)
    .condition(Condition.eq('id', 2))
    .join(
        AssociativeCondition
            .table(关联表)
            .leftJoin(主表主键, 关联主表字段)
    )
    // 可以2个join,比如使用单独的关联表实现多对多
    // 第一个join是关联表,然后第二个join通过setMain关联到第一个join
    .join(
        AssociativeCondition
            .table(子表名称)
            .setMain(关联表)
            .leftJoin(关联子表字段, 子表主键)
            .get([字段1, 字段2])
    )
    .page(0, 10)
    .send();

配置

可以自定义http client,这样可以方便设置token和拦截器

全局设置

GlobalBuildConfig.setHttp(axios.create());
GlobalBuildConfig.setQueryRestUrl('/api/json/get');
GlobalBuildConfig.setCrudRestUrl('/api/json/crud');

单独配置

await QueryBuilder
    .by({
        table: 表名称,
        http: axios.create(),
        // 默认为/get
        restUrl: '/api/json/get'
    })
    .page(0, 20)
    .send();
await CrudBuilder
    .by({
        table: 表名称,
        method: 'delete',
        http: axios.create(),
        // 默认为/crud
        restUrl: '/api/json/crud'
    })
    .id(id)
    .send();