一对多

优质
小牛编辑
141浏览
2023-12-01

一对多 多对一 关联模型

  • 一对多: 一个部门有很多员工,但一个员工只能从属于一个部门
  • 多对一: 多个员工只能属于一个部门


department 部门表,employee 员工表



egg-sequelize 实现一对多

分类表:


商品表:


分类 1------n 商品

1、model 里面建2张模型,分别是 category.js goods.js

2、catrgory.js 模型代码:

module.exports = app => {
 const {Sequelize} = app
 const {STRING,INTEGER} = Sequelize

 const Category = app.model.define('category', {
     id: { type: INTEGER, primaryKey: true, autoIncrement: true },
     title: { type: STRING }
 }, { timestamps: false , paranoid: false});

 // 分类表关联商品表 1:n
 Category.associate = function() {
     app.model.Category.hasMany(app.model.Goods, { as: 'goods', foreignKey: 'cate_id', targetKey: 'id'});
 };

 return Category;
}

3、goods.js 模型代码:

module.exports = app => {
 const {Sequelize} = app
 const {STRING,INTEGER} = Sequelize

 const Goods = app.model.define('goods', {
     id: { type: INTEGER, primaryKey: true, autoIncrement: true },
     title: { type: STRING },
     price: {type: INTEGER},
     cate_id: {type: INTEGER}
 }, { timestamps: false , paranoid: false});

 // 商品表从属分类 n-1
 Goods.associate = function() {
     app.model.Goods.belongsTo(app.model.Category, { as: 'cate', foreignKey: 'cate_id', targetKey: 'id'});
 };

 return Goods;
}

4、controller 查询

const {Op} = this.app.Sequelize;
const {Sequelize} = this.app;
// 查询所有分类下对应的所有商品 分类 1----n 商品
const cate = await this.ctx.model.Category.findAll({
  include: [{
    model: this.ctx.model.Goods,
    as: 'goods',
    attributes:[[Sequelize.fn('COUNT', Sequelize.col('*')), 'total_goods']]
  }],
  attributes: ['title'],
  group: 'title',
  distinct: true
});

// 查询商品所对应的分类 商品 n-----1 分类
const goods = await this.ctx.model.Goods.findAll({
  include: [{
    model: this.ctx.model.Category,
    as: 'cate'
  }],
  distinct: true
})