node.js - 序列化属于多个关联 : create a post and associate its existing tags

标签 node.js sequelize.js has-and-belongs-to-many

我通过belongsToMany关联获得了两个模型关联。

Posts.js:

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Posts = sequelize.define('Posts', {
    title: DataTypes.STRING,
    body:  DataTypes.STRING
  }, {
    classMethods: {
      associate: function(models) {
        Posts.belongsToMany(models.Tags, {
          through: 'PostsTags',
          as:'posts_has_tags',
          foreignKey:'postId'
        });
      }
    }
  });
  return Posts;
};

和 Tags.js :

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Tags = sequelize.define('Tags', {
    name: DataTypes.STRING
  },{
    classMethods: {
      associate: function(models) {
        Tags.belongsToMany(models.Posts, {
          through: 'PostsTags',
          as:'posts_has_tags',
          foreignKey:'tagId'
        });
      }
    }
  });
  return Tags;
};

在我的数据库中,我有 2 个现有标签。 (id:1 和 id:2) 当我创建帖子时遇到麻烦,我想将其与这些标签之一关联。

通过运行此代码:

  create: function(request, reply){
    let post = Object.assign({}, request.payload, request.params);

    models.Posts.create({
        title:  post.title,
        body:   post.body,
        posts_has_tags: [{tagId:1}]
    },{
        include: [{model:models.Tags, as:'posts_has_tags'}]
    }).then(function(newPost){

        if(!newPost){
          return reply('[404] Not found').code(404);
        }
        reply(newPost).code(200);
    })
  }

它运行此查询:

INSERT INTO `Posts` (`id`,`title`,`body`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'TITLE 1','BODY 1','2017-02-05 18:33:21','2017-02-05 18:33:21');

Executing (default): INSERT INTO `Tags` (`id`,`createdAt`,`updatedAt`) VALUES (DEFAULT,'2017-02-05 18:33:21','2017-02-05 18:33:21');

Executing (default): INSERT INTO `PostsTags` (`createdAt`,`updatedAt`,`postId`,`tagId`) VALUES ('2017-02-05 18:33:21','2017-02-05 18:33:21',70,20);
  1. 它创建了一个新帖子,但也创建了一个我不想要的新标签。
  2. 它在 poststags 表中创建关联,但标签 ID 不正确(刚刚创建的标签 ID,而不是 ID 1)
  3. 在 promise 中,我如何访问 setAssociation() 或 addAssocation() 方法sequelize应该在belongsToMany关联上创建:

如果我尝试 newPost.addTags 或 newPost.setTags、models.Posts.addTags 或 models.Posts.setTags,我会遇到错误或未定义

如果有人能帮助我,我很欢迎。 我坚持了几天,我想了解如何以最好的方式使用sequelize。

最佳答案

我更改了两个模型的别名“as”:

Posts.js:

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Posts = sequelize.define('Posts', {
    title: DataTypes.STRING,
    body:  DataTypes.STRING
  }, {
    classMethods: {
      associate: function(models) {
        Posts.belongsToMany(models.Tags, {
          through: 'PostsTags',
          as:'postHasTags',
          foreignKey:'postId'
        });
      }
    }
  });
  return Posts;
};

标签.js:

'use strict';
module.exports = function(sequelize, DataTypes) {
  var Tags = sequelize.define('Tags', {
    name: DataTypes.STRING
  },{
    classMethods: {
      associate: function(models) {
        Tags.belongsToMany(models.Posts, {
          through: 'PostsTags',
          as:'tagHasPosts',
          foreignKey:'tagId'
        });
      }
    }
  });
  return Tags;
};

两个别名都颠倒了。

当我创建新帖子或更新帖子时,我可以访问 Promise 中由sequelize (model.setAssociation) 构建的setter:

upsert: function(request, reply){
    let receivedPost = Object.assign({}, request.payload, request.params);

    models.Posts.find({
      where:{ id:receivedPost.id }
    }).then(post => {
      if(post){
        post.setPostHasTags(receivedPost.tags)
        reply(post).code(200)
      } else {
        models.Posts.create({
            title:  receivedPost.title,
            body:   receivedPost.body
        }).then(newPost => {
            newPost.setPostHasTags(receivedPost.tags)
            reply(newPost).code(200);
        });
      }
    });

关于node.js - 序列化属于多个关联 : create a post and associate its existing tags,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42056147/

相关文章:

javascript - 检查内部带有mysql调用的for循环是否完成nodejs

mysql - NodeJS/Sequelize/MySQL - 为什么需要 postgres 依赖项?

node.js - 后续迁移 : Adding multiple foreign keys to the same model?

postgresql - 非公共(public)模式中的 Postgres 外键约束

javascript - 如何使用 javascript 对谷歌数据存储进行压力测试?

javascript - 具有多个域的单个 Meteor 应用程序

node.js - 是否可以从 shell 脚本捕获 node.js 中的错误退出代码?

ruby-on-rails - ActiveAdmin - 在 DSL 中实现 HABTM/多维数组

ruby-on-rails - Rails 事件记录,如何在 HABTM 关系中查询

ruby-on-rails - has_and_belongs_to_many 或 has_many 用于用户/组关系?