如何在Sequelize中自我引用多对多关联?

时间:2014-08-18 12:52:29

标签: sequelize.js

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

如果我在没有Sequelize的情况下对此进行建模,我会有一个名为ParentTasks的表格,它会有一个ParentTaskId和一个TaskId来确定关系,并且{{1以Tasks为主键的表。

使用Sequelize,这可能吗?我尝试了很多不同的排列和组合,但没有一个导致我想要的东西。

任何帮助都将不胜感激。

感谢。

2 个答案:

答案 0 :(得分:6)

你有什么尝试?

这个怎么样:

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

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

答案 1 :(得分:1)

根据上述评论中的Asaf,hasMany不再有效。这是使用belongsToMany的解决方案:

用户模型:

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;
};

UserUsers模型:

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]);
  });
});

models.Users.findOne({ where: { name: 'name'} })
.then(person => {
  person.getSiblings()
  .then(siblings => { console.log(siblings) });
});

参考:Sequelize docs