🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
[TOC] ### 一对多 多对一 关联模型 描述: 一对多: 一个部门有很多员工,但一个员工只能从属于一个部门 多对一: 多个员工只能属于一个部门 ***** 示例: ![](https://box.kancloud.cn/b2542fd7e69d1115f6df51b6c57d6b2b_543x230.png) department 部门表 employee 员工表 ***** ***** ### egg-sequelize 实现一对多 分类表: ![](https://box.kancloud.cn/b18d04fcc70fe07790339ab065b91830_133x122.png) 商品表: ![](https://box.kancloud.cn/1b436b5196d8391cccbb1e51da521899_260x176.png) 分类 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 }) ~~~