Sequelize.js 如何在Sequelize中拥有自引用多对多关联?

Sequelize.js 如何在Sequelize中拥有自引用多对多关联?,sequelize.js,Sequelize.js,我有一个名为任务的模型,它可以有许多父任务(多个祖先任务)和/或子任务 如果我对此建模而不进行续集,我会有一个名为ParentTasks的表,它将有一个ParentTaskId和一个TaskId来确定关系,还有一个Tasks表,其中一个id作为主键 使用Sequelize,这可能吗?我尝试过很多不同的排列和组合,但没有一种能满足我的需求 任何帮助都将不胜感激 谢谢。你试过什么 这个怎么样: var Task = sequelize.define('Task', { name: Sequeli

我有一个名为
任务
的模型,它可以有许多父任务(多个祖先任务)和/或子任务

如果我对此建模而不进行续集,我会有一个名为
ParentTasks
的表,它将有一个
ParentTaskId
和一个
TaskId
来确定关系,还有一个
Tasks
表,其中一个
id
作为主键

使用Sequelize,这可能吗?我尝试过很多不同的排列和组合,但没有一种能满足我的需求

任何帮助都将不胜感激

谢谢。

你试过什么

这个怎么样:

var Task = sequelize.define('Task', {
  name: Sequelize.STRING
});

Task.belongsToMany(Task, { as: 'children', foreignKey: 'ParentTaskId', through: 'ParentTasks' });
Task.belongsToMany(Task, { as: 'parents', foreignKey: 'TaskId', through: 'ParentTasks' });

根据Asaf在上述评论中的说法,请参考

,hasMany已不再有效。下面是一个使用belongtomany的解决方案:

用户模型:

module.exports = (sequelize, DataTypes) => {
  const Users = sequelize.define('Users', {
    id: {
      type: DataTypes.INTEGER,
      primaryKey: true,
      allowNull: false,
      autoIncrement: true
    },
    name: {
      type: DataTypes.STRING,
      allowNull: false
    }
  }, {
    freezeTableName: true
  });

  Users.associate = function(models) {
    Users.belongsToMany(models.Users, { through: models.UserUsers, as: 'Parents', foreignKey: 'parentId' });
    Users.belongsToMany(models.Users, { through: models.UserUsers, as: 'Siblings', foreignKey: 'siblingId' });
  };

  return Users;
};
用户模型:

module.exports = (sequelize, DataTypes) => {
  const UserUsers = sequelize.define('UserUsers', {
  }, {
    freezeTableName: true
  });

  UserUsers.associate = function(models) {
    UserUsers.belongsTo(models.Users, { as: 'Parent', onDelete: 'CASCADE'});
    UserUsers.belongsTo(models.Users, { as: 'Sibling', onDelete: 'CASCADE' });
  };

  return UserUsers;
};
使用此选项,您可以设置并获得如下结果:

models.Users.findOne({ where: { name: 'name' } })
.then(u1 => {
  models.Users.findOne({ where: { name: 'name2'} })
  .then(u2 => {
    u2.addSibling(u1);
    // or if you have a list of siblings you can use the function:
    u2.addSiblings([u1, ...more siblings]);
  });
});


参考资料:

你能给我一个代码示例吗?当我打开给定的链接时,该页面上有很多代码示例。也许您需要给出任何不适合您的代码示例。你似乎问了一个一般性的问题,但心里却有一个非常具体的问题。我想,stackoverflow的大多数人都不擅长读心术。@如果是404s页,你通常应该在这里发布。这是。@Noah:1,5年的链接已经过时了-我删除了链接中的评论;仅针对其他人:sequelizejs.com上有/有这些信息(使用g***)嘿,看起来答案已经过时了。。。我收到以下错误:hasMany不支持N:m关联。改用belongstomy
models.Users.findOne({ where: { name: 'name'} })
.then(person => {
  person.getSiblings()
  .then(siblings => { console.log(siblings) });
});