# @ctsy/model

> > 封装的Sequelize作为数据库操作底层，对Sequelize的部分操作进行了简化，语法结构类似于ThinkPHP3.2结构。 需要依赖于 castle-config/castle-controller/sequelize，其它依赖请参见相关库的依然范围 # 典型基础用法 ```typescript //获取模型对象 let model = await this.M('Sex'); //启动事务 =1 await this.startTrans(); //添加数据 // INSERT INTO se

Latest version **2.0.47** (published 2021-12-28) · ISC license · 0 weekly downloads

## Install

```sh
npm install @ctsy/model
pnpm add @ctsy/model
yarn add @ctsy/model
bun add @ctsy/model
```

## Health

**Score 25/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities; high quality score.

Warnings: low downloads; no esm support.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 2.0.47 |
| Published | 2021-12-28 |
| First published | 2019-04-15 |
| Weekly downloads | 0 |
| License | ISC |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 4 |
| Unpacked size | 57 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| GitHub stars | 0 |
| Maintainers | yanpengquan, ida_xyt |

## Links

- npm: https://www.npmjs.com/package/@ctsy/model
- Repository: https://github.com/YanCastle/castle-model
- Homepage: https://github.com/YanCastle/castle-model#readme
- Issues: https://github.com/YanCastle/castle-model/issues
- npm.io page: https://npm.io/package/@ctsy/model

## Dependencies (4)

- [lodash](https://npm.io/package/lodash.md) *
- [mysql2](https://npm.io/package/mysql2.md) *
- [sequelize](https://npm.io/package/sequelize.md) 6
- [@ctsy/hook](https://npm.io/package/@ctsy/hook.md) *

## Recent versions

- 2.0.47 (latest) — 2021-12-28
- 2.0.46 — 2021-12-28
- 2.0.45 — 2021-11-20
- 2.0.44 — 2021-08-04
- 2.0.43 — 2021-07-21
- 2.0.42 — 2021-07-20
- 2.0.41 — 2021-07-19
- 2.0.40 — 2021-03-26
- 2.0.39 — 2021-03-25
- 2.0.38 — 2021-02-16
- 2.0.37 — 2021-02-16
- 2.0.36 — 2021-02-01
- 2.0.35 — 2021-02-01
- 2.0.34 — 2021-01-16
- 2.0.32 — 2020-12-30
- … 46 more at https://npm.io/package/@ctsy/model/versions

## README

# CastleModel数据库操作类
> 封装的Sequelize作为数据库操作底层，对Sequelize的部分操作进行了简化，语法结构类似于ThinkPHP3.2结构。
需要依赖于 castle-config/castle-controller/sequelize，其它依赖请参见相关库的依然范围
# 典型基础用法
```typescript
//获取模型对象
let model = await this.M('Sex');
//启动事务 =1
await this.startTrans();
//添加数据
// INSERT INTO sex(UID,Sex) VALUES(6,1);
await model.add({ UID: 6, Sex: 1 });
//批量添加
// INSERT INTO sex(UID,Sex) VALUES(6,1),(8,1);
await model.addAll([
    {
        UID: 6, Sex: 1
    },
    {
        UID: 8, Sex: 1
    },
])
//更新数据
// UPDATE sex SET Sex=100 WHERE UID > 7 LIMIT 1;
await model.where({ UID: { gt: 7 } }).limit(1).save({ Sex: 100 });
//自增自减处理,UID>7的Sex全部-1,UID+1
// UPDATE sex SET Sex=Sex-1,UID=UID+1 WHERE UID > 7;
await model.where({ UID: { gt: 7 } }).incOrDec({ Sex: -1, UID: 1 })
//当存在DTime时自动做软删除，否则就是硬删除
// DELETE FROM sex WHERE UID > 8;
// UPDATE sex SET DTime = now() WHERE UID > 8;
await model.where({ UID: { gt: 8 } }).del()
//查询单个
// SELECT * FROM sex WHERE UID > 8;
await model.where({ UID: { gt: 8 } }).find()
//分页查询多个
// SELECT * FROM sex WHERE UID > 1 LIMIT 1,10;
await model.where({ UID: { gt: 1 } }).page(1, 10).select()
// 查询并统计
// SELECT * FROM sex WHERE UID > 1;
// SELECT COUNT(*) FROM sex WHERE UID > 1;
await model.where({ UID: { gt: 1 } }).selectAndCount();
//指定字段查询
// SELECT UID FROM sex LIMIT 1;
await model.fields('UID').find()
//排除字段查询
// SELECT Sex FROM sex LIMIT 1;
await model.fields('UID', true).find()
//批量条件更新，仅支持MySQL
// UPDATE sex SET Sex = CASE UID WHEN 1 THEN 2 WHEN 5 THEN 10 WHEN 7 THEN Sex+5 ELSE Sex END WHERE UID IN (1,5,7);
await model.caseSave([{ field: { case: 'UID', save: "Sex" }, data: { 1: 2, 5: 10, 7: "`Sex`+5" } }])
//执行自定义SQL查询，通过__DB_PREFIX__注入表前缀
await model.query(`SELECT * FROM __DB_PREFIX__sex`)
//执行自定义SQL，
await model.exec(`UPDATE Sex SET UID=UID+1`, 'UPDATE')
//执行存储过程或函数
await model.exec(`CALL reset();`, 'RAW')
//查询单个字段且只要一个，返回值为单个字段的值
// SELECT Sex FROM sex LIMIT 1;
await model.getFields('Sex');
//查询单个字段且返回数组，返回值为该字段的数据
// SELECT Sex FROM sex;
await model.getFields('Sex', true);
//查询多个字段，以第一个字段为键返回，
// SELECT UID,Sex FROM sex;
let rs:{
    [index:string]:{
        UID:number,Sex:number
        }
} = await model.getFields('UID,Sex', true);
//支持排序
// SELECT * FROM sex ORDER BY UID DESC;
await model.order('UID DESC').select();
//支持group操作
// SELECT SUM(UID) AS UID FROM sex GROUP BY UID;
await model.group(['UID']).fields([[Sequelize.fn('sum', Sequelize.col('UID')), 'UID']]).select()
//支持SUM等统计函数处理
// SELECT SUM(UID) AS UID FROM sex GROUP BY Sex;
await model.fnField(DbFn.SUM, 'UID', 'UID').group(['Sex']).select();
//支持limit，不适用page方法时
// SELECT * FROM sex LIMIT 1;
await model.limit(1).select();
//支持直接封装的SUM操作
// SELECT SUM(UID) AS UID FROM sex GROUP BY UID;
await model.group(['UID']).sum('UID')
//支持自动检测是否存在，若不存在则自动添加
// SELECT * FROM sex WHERE UID=10 AND Sex=1;
// INSERT INTO sex(UID,Sex) VALUE(10,1);
await model.addIfNotExist({ UID: 10, Sex: 1 })
//也可以自定义存在检测条件
// SELECT * FROM sex WHERE UID=11;
// INSERT INTO sex(UID,Sex) VALUE(10,1);
await model.addIfNotExist({ UID: 11, Sex: 1 }, { UID: 11 })
//提交事务，两种方式都行，此处的this指向 BaseController
// -1 == 0 具体执行commit，否则直接跳过
await this.commit();
await model.commit()
//回滚事务，两种方式都行
// 具体执行rollback，否则直接跳过
await this.rollback();
await model.rollback()
//支持嵌套事务 +1
await this.startTrans();
await this.startTrans();
await this.startTrans();
await this.commit();
await this.commit();
await this.commit();
//当提交次数=开起次数时最后一次提交，之后的commit会报错
await this.commit();
//若中途发生一次rollback调用则会直接抛出错误
await this.rollback()
```

---
_Source: https://npm.io/package/@ctsy/model · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
