Node.js Sequelize belongtomany associations:创建一篇文章并关联其现有标记

Node.js Sequelize belongtomany associations:创建一篇文章并关联其现有标记,node.js,sequelize.js,has-and-belongs-to-many,Node.js,Sequelize.js,Has And Belongs To Many,我有两个模特协会的同事 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.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;
};
'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;
};
和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;
};
'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;
};
在我的数据库中,我得到了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);
  • 它创建了一个新帖子,但也创建了一个我不想要的新标签
  • 它在poststags表中创建关联,但带有错误的标记id(刚创建的标记id而不是id 1)
  • 在promise中,我如何访问sequelize应该在以下关联上创建的setAssociation()或addAssociation()方法:
  • 如果我尝试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:'posts_has_tags',
              foreignKey:'postId'
            });
          }
        }
      });
      return Posts;
    };
    
    '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;
    };
    
    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;
    };
    
    '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);
            });
          }
        });
    

    setPostHasTags将返回一个承诺,对吗?在答复之前,您应该为其包含一个then()。