外键,hasMany关联,对应 sql语句的 foreign key 进行表关联
hasOne
belongsTo
hasMany
belongsToMany

  1. const A = sequelize.define('A', {});
  2. const B = sequelize.define('B', {});
  3. A.hasOne(B); // A 有一个 B,外键在目标模型(B)中定义 B foreignKey
  4. A.belongsTo(B); // A 属于 B,外键在目标模型(A)中定义;A forgienKey
  5. A.hasMany(B); // A 有多个 B 外键在目标模型(B)中定义
  6. A.belongsToMany(B, { through: 'C' }); // A 属于多个 B , 通过联结表 C

一对一关系

hasOne 和 belongsTo 关联一起使用

有两个模型 Foo 和 Bar 拥有关联关系

  1. Foo.hasOne(Bar)
  2. Foo.belongsTo(Bar)
  3. fooInstance.getBar()
  4. fooInstance.setBar()
  5. fooInstance.createBar()

一对多关系

hasMany he belongsTo 关联一起使用

  1. Foo.hasMany(Bar)
  2. Foo.belongsToMany(Bar, { through: Baz })
  3. fooInstance.getBars()
  4. fooInstance.countBars()
  5. fooInstance.hasBar()
  6. fooInstance.hasBars()
  7. fooInstance.setBars()
  8. fooInstance.addBar()
  9. fooInstance.addBars()
  10. fooInstance.removeBar()
  11. fooInstance.removeBars()
  12. fooInstance.createBar()

多对多关系

两个 belongsToMany 调用一起使用

超级多对多

m:n关系
https://www.sequelize.com.cn/advanced-association-concepts/advanced-many-to-many

多对多代码流程

  • 创建表Foo,Bar ,设置为多对多,中间表为FooBar
  • sequelize.sync();同步到数据库,就是说如果模型对应的表不存在就创建,插入数据 foo, bar
  • foo.addBar(bar)
    • foo 关联了一个bar,反映到数据库上面,
    • 则是中间表Foo_Bar插入一条数据 INSERT INTO Foo_Bar (FooId,BarId) VALUES(1,1)
  • Foo.findOne({ include: Bar })
    • 数据查询,根据模型,查出Foo表的第一条数据,并带上关联表数据,
    • 字段是Bars(因为是多对多,所以这里是复数形式,每一条bar包含中间表的数据字段是 FooBar ```jsx const Foo = sequelize.define(‘Foo’, { name: DataTypes.TEXT }); const Bar = sequelize.define(‘Bar’, { name: DataTypes.TEXT }); Foo.belongsToMany(Bar, { through: ‘Foo_Bar’ }); Bar.belongsToMany(Foo, { through: ‘Foo_Bar’ });

await sequelize.sync(); const foo = await Foo.create({ name: ‘foo’ }); const bar = await Bar.create({ name: ‘bar’ }); await foo.addBar(bar);// foo这条数据关联了一条bar,反映到表上则是在中间表Foo_Bar上插入一条数据 const fetchedFoo =await Foo.findOne({ include: Bar }); console.log(JSON.stringify(fetchedFoo, null, 2));

  1. 输出json
  2. ```jsx
  3. {
  4. "id": 1,
  5. "name": "foo",
  6. "Bars": [
  7. {
  8. "id": 1,
  9. "name": "bar",
  10. "Foo_Bar": {
  11. "FooId": 1,
  12. "BarId": 1
  13. }
  14. }
  15. ]
  16. }

include

include 参数完成预先加载,翻译成sql其实就是 通过join关联子句

UserModel

数据建模,User用户模型
app/model/user.js

  1. module.exports = app => {
  2. const { STRING, INTEGER } = app.Sequelize;
  3. const User = app.model.define('user', {
  4. id: {
  5. type: INTEGER,
  6. autoIncrement: true,
  7. primaryKey: true
  8. },
  9. name: {
  10. type: STRING,
  11. allowNull: false
  12. },
  13. password: {
  14. type: STRING(32),
  15. allowNull: false
  16. }
  17. });
  18. // 表关联的字段
  19. User.associate = function() {
  20. // 一对多
  21. app.model.User.hasMany(app.model.Diary, { foreignKey: 'user_id', targetKey: 'id'})
  22. }
  23. return User;
  24. }

app/model/diary.js

  1. module.exports = app => {
  2. const { STRING, INTEGER } = app.Sequelize;
  3. const Diary = app.model.define('diary', {
  4. id: {
  5. type: INTEGER,
  6. autoIncrement: true,
  7. primaryKey: true
  8. },
  9. title: {
  10. type: STRING,
  11. allowNull: false
  12. },
  13. content: {
  14. type: STRING,
  15. allowNull: false
  16. }
  17. });
  18. // 表关联的字段
  19. Diary.associate = function() {
  20. app.model.Diary.belongsTo(app.model.User, { foreignKey: 'user_id', targetKey: 'id'})
  21. }
  22. return Diary;
  23. }

controller 中调用 model

app/controller/home.js

  1. 'use strict';
  2. const Controller = require('egg').Controller;
  3. class HomeController extends Controller {
  4. async index() {
  5. const { ctx } = this;
  6. ctx.body = 'hi, egg';
  7. }
  8. // 添加日志
  9. async add() {
  10. const { ctx } = this;
  11. // 从前端获取post请求发来的数据
  12. const param = ctx.request.body;
  13. const result = await ctx.model.Diary.create({
  14. title: param.title,
  15. content: param.content,
  16. user_id: 2
  17. });
  18. console.log('add方法', result);
  19. if(result){
  20. ctx.body = '创建成功';
  21. }else{
  22. ctx.body = '创建失败';
  23. }
  24. }
  25. // 登录判断
  26. async loginCheck() {
  27. const { ctx } = this;
  28. // 关联查询
  29. // const data = await ctx.model.User.findAll({
  30. // include: {
  31. // model: ctx.model.Diary
  32. // }
  33. // });
  34. // ctx.body = data;
  35. // post请求传来的参数
  36. const { name, password } = ctx.request.body;
  37. let message = '', data = {};
  38. // 判断数据库里面是否存在该用户
  39. const user = await ctx.model.User.findOne({
  40. where: {
  41. name: name
  42. }
  43. });
  44. if(!user){
  45. message = '用户不存在';
  46. }else if(password !== user.password){
  47. message = '密码错误';
  48. }else{
  49. message = '登录成功';
  50. data = { id: user.id };
  51. }
  52. ctx.body = {
  53. message,
  54. data
  55. };
  56. }
  57. }
  58. module.exports = HomeController;

Field ‘id’ doesn’t have a default value 解决
设置 id 为自动递增,autoIncrement