[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
})
~~~
- 概述
- 起步
- 跨域配置
- 路径别名
- 路由
- api版本控制
- 错误和异常
- 全局异常处理
- 数据库
- 创建迁移文件
- sequelize数据类型
- 配置
- 新增
- 查询
- 条件查询
- 模糊查询
- 排序查询
- 聚合查询
- 分组查询
- 分页查询
- 修改
- 删除
- 获取器
- 修改器
- 静态属性
- 字段验证
- 外键约束
- 关联模型
- 一对一
- 一对多
- 左外连接
- 多对多
- 字段显示隐藏
- 事务
- 字段自增
- 验证层
- egg-validate
- indicative验证器
- egg-validate-plus
- betterValidate
- 校验规则
- 中间件
- 安全
- 数据加密
- 单向加密
- 示例代码
- 封装egg加密
- 上传
- path模块
- 单文件上传
- 多文件上传
- 按照日期存储
- 工具函数
- egg常用工具函数
- 缓存
- 配置缓存插件
- 设置缓存
- 获取缓存
- 删除缓存
- 消息队列
- rabbitMQ
- 安装
- 简单队列
- 工作队列
- 工作队列(dispach分发)
- 消息应答和持久化
- redis
- 数据类型
- 字符串类型(String)
- 哈希类型(Hash)
- 列表(List)
- 无序集合(Set)
- 可排序集合(Zset)
- 邮件系统
- nodeMailer
- 第三方模块
- 生成随机数
- JWT
- JWT鉴权
- 生成Token
- 短信服务
- 阿里大鱼短信验证码
- 发送短信逻辑
- 阿里短信Node类