多态多对多

还是就这之前标签的例子,但是为了不破坏之前的代码,这回新建一个scopeManyToMany.ts文件。代码如下。

scope 里面指定的值, 就是在连接表创建数据的时候,会自动把里面设定好的字段填充好,并且查询的时候会自动把这个条件当做 where 的一项,所以这样我们就能做出区分了。

  1. import Sequelize from 'sequelize';
  2. const sequelize = new Sequelize('nodelover', 'root', '', {
  3. host: 'localhost',
  4. dialect: 'mysql',
  5. pool: {
  6. max: 5,
  7. min: 0,
  8. idle: 10000
  9. },
  10. });
  11. const Post = sequelize.define('Post', {});
  12. const ItemTag = sequelize.define('item_tag', {
  13. tag_id: {
  14. type: Sequelize.INTEGER
  15. },
  16. type: {
  17. type: Sequelize.STRING
  18. },
  19. type_id: {
  20. type: Sequelize.INTEGER
  21. }
  22. });
  23. const Tag = sequelize.define('tag', {
  24. name: Sequelize.STRING
  25. });
  26. Post.belongsToMany(Tag, {
  27. through: {
  28. model: ItemTag,
  29. scope: {
  30. type: 'post'
  31. }
  32. },
  33. foreignKey: 'type_id',
  34. constraints: false
  35. });
  36. Tag.belongsToMany(Post, {
  37. through: {
  38. model: ItemTag,
  39. scope: {
  40. type: 'post'
  41. }
  42. },
  43. foreignKey: 'tag_id',
  44. constraints: false
  45. });
  46. (async () => {
  47. await sequelize.sync();
  48. let post = await Post.create();
  49. await (post as any).createTag({name: '春风'});
  50. let tag = await Tag.create({name:'夏雨'});
  51. await (tag as any).createPost();
  52. })();

挑出一段代码做个简单的说明

  1. Tag.belongsToMany(Post, {
  2. through: {
  3. model: ItemTag,
  4. scope: {
  5. type: 'post'
  6. }
  7. },
  8. foreignKey: 'tag_id',
  9. constraints: false
  10. });

以上代码阐述了一下内容

Tag 与 Post 建立的关系模型是 ItemTag,此时的主体是 Tag,当 Tag使用 createPost、XXXPosts、或者其他方法的时候,会自动把 ItemTag 模型里面的 type 字段填充为 Post,并且 ItemTag 与 Tag 之间有关系的字段,并且在 ItemTag 模型里面的字段叫做 Tag_id。

运行以上代码之后,便可以在数据库中看到相关的数据。