一对多
优质
小牛编辑
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
})