sequelize,belongsToMany 多对多关联笔记

文章发布于2020年10月21日 11:04, 归类于: Node.js

定义表

// 电影表
const MovieModel = sequelize.define("Movies", {
  title: { type: DataTypes.STRING, unique: true }
}, {
  freezeTableName: true,
  charset: 'utf8',
  collate: 'utf8_general_ci'
});

// 演员表
const ActorModel = sequelize.define("Actors", {
  name: { type: DataTypes.STRING, unique: true }
}, {
  freezeTableName: true,
  charset: 'utf8',
  collate: 'utf8_general_ci'
});

多对多关联

  1. 使用主键 movie 和 actor。
MovieModel.belongsToMany(ActorModel,{through:'ActorMovies'});

将自动创建联结表ActorMovies,联结表带有字段MovieIdActorId

  1. 使用主键 movie,但使用 actor 的不同字段。
MovieModel.belongsToMany(ActorModel, { through: 'ActorMovies', targetKey: 'name' })

将自动创建联结表ActorMovies,联结表带有字段MovieIdActorName

  1. 使用主键 actor,但使用 movie 的不同字段。
MovieModel.belongsToMany(ActorModel, { through: 'ActorMovies', sourceKey: 'title' })

将自动创建联结表ActorMovies,联结表带有字段MovieTitleActorId

  1. 使用不同的字段 movie 和 actor。
MovieModel.belongsToMany(ActorModel, { through: 'ActorMovies', sourceKey: 'title',targetKey: 'name' })

将自动创建联结表ActorMovies,联结表带有字段MovieTitleActorName

关联引用字段必须具有唯一性约束。

自定义创建联结表

上面进行表关联会自动创建联结表,为了更好的使用联结表,我应该自己创建和完善表字段。

创建联结表和创建普通表其实是一样的,没有区别。

const { DataTypes } = require("sequelize");
const ActorMovieModel = sequelize.define("ActorMovies", {
  years: {
    type: DataTypes.STRING,
    allowNull: false,
    validate: {
      custom(value) {
        if (!/^\d{4}$/.test(value)) {
          throw new Error("请输入正确的年份,如‘2020’");
        }
      }
    }
  }
}, {
  freezeTableName: true,
  charset: 'utf8',
  collate: 'utf8_general_ci'
});
MovieModel.belongsToMany(ActorModel, { through: ActorMovieModel })

联结表ActorMovies带有字段yearsMovieIdActorIdMovieIdActorId字段会自动添加到表中去。

特殊方法

movieInstance.getActors()
movieInstance.countActors()
movieInstance.hasActor()
movieInstance.hasActors()
movieInstance.setActors()
movieInstance.addActor()
movieInstance.addActors()
movieInstance.removeActor()
movieInstance.removeActors()
movieInstance.createActor()

新增

createActor

let movie = await MovieModel.create({ title: '《超人迪加》' });
let actor = await movie.createActor({ name: '炖大鹅' }, { through: { years: 2020 } });
await movie.addActors(actor)

上面我定义的联结表years字段不能为空,所以在新增的时候,需要设置联结表的years,不然会报错:notNull Violation: ActorMovies.years cannot be null。

电影表:

id title createdAt updatedAt
1 《超人迪加》 2020-10-20 09:33:04 2020-10-20 09:33:04

演员表:

id name createdAt updatedAt
1 炖大鹅 2020-10-20 09:33:04 2020-10-20 09:33:04

联结表:

years createdAt updatedAt MovieId ActorId
2020 2020-10-20 09:33:04 2020-10-20 09:33:04 1 1

查询

hasActor

let movie = await MovieModel.findByPk(1);
let actor = await ActorModel.findByPk(1);
let data = await movie.hasActors(actor) // true
let movie = await MovieModel.findByPk(1);
let actor = await ActorModel.findByPk(2);
let data = await movie.hasActors(actor) // false

转载请注明来源:《 sequelize,belongsToMany 多对多关联笔记》- rojerYong's Blog

文章链接:https://www.eoway.cn /article/1603249468.html

如果此文摘取了你的原创,请联系本站管理员,将对此文修改、删除处理。

--END--
上一篇:nodejs接入gitee码云OAuth2登录(第三方登录) 下一篇:sequelize,hasMany,belongsTo 一对多关联笔记