CabloyJS对EggJS中的数据库操作方法进行了进一步封装和扩展,提供了以下机制:

  1. 提供ctx.db对象,可以便利的支持数据库事务
  2. 提供model对象,可以便利的支持多实例软删除

ctx.db对象

EggJS是在app对象上提供数据库连接对象,而CabloyJS在ctx对象上提供数据库连接对象,便于在启动数据库事务时,在上下文环境中保持同一个数据库连接。在这里,我们先看看通过ctx.db如何完成常规的增删改查等操作

ctx.db提供的数据库操作方法与EggJS基本一致

在模块test-party中,有一个数据表testParty,我们新增后端API路由kitchen-sink/guide/echo6,在其对应的控制器方法中进行testParty增删改查等操作

src/module/test-party/backend/src/controller/kitchen-sink/guide.js

async echo6() {
  // testParty: insert/udpate/delete/get

  // insert
  const res = await this.ctx.db.insert('testParty', {
    iid: this.ctx.instance.id,
    deleted: 0,
    personCount: 3,
  });
  const id = res.insertId;
  // update
  await this.ctx.db.update('testParty', {
    id,
    personCount: 5,
  });
  // get
  const item = await this.ctx.db.get('testParty', {
    id,
  });
  // delete
  await this.ctx.db.delete('testParty', {
    id,
  });
  // ok
  this.ctx.success(item);
}

model对象

model对象对ctx.db进行了进一步封装,可以便利的支持多实例软删除

  1. 多实例:自动将ctx.instance.id注入到ctx.db相关方法的参数中
  2. 软删除:自动将modeldelete方法修改为update方法,并将数据表的deleted字段从0修改为1

定义model对象

src/module/test-party/backend/src/model/party.js

module.exports = app => {
  class Party extends app.meta.Model {
    constructor(ctx) {
      super(ctx, { table: 'testParty', options: { disableDeleted: false } });
    }
  }
  return Party;
};
名称 默认值 说明
table model对象对应的数据表名,也可以是视图名
disableDeleted false 是否禁用软删除特性

引用model对象

为了支持业务模块的编译特性,便于Webpack打包,所有对象都需要显式require,model对象也不例外

src/module/test-party/backend/src/models.js

const party = require('./model/party.js');

module.exports = app => {
  const models = {
    party,
  };
  return models;
};

使用model对象

我们看看使用model对象如何实现同样的增删改查等操作

async echo7() {
  // testParty: insert/udpate/delete/get

  // insert
  const res = await this.ctx.model.party.insert({ personCount: 3 });
  const id = res.insertId;
  // update
  await this.ctx.model.party.update({ id, personCount: 6 });
  // get
  const item = await this.ctx.model.party.get({ id });
  // delete
  await this.ctx.model.party.delete({ id });
  // ok
  this.ctx.success(item);
}