如何在节点

时间:2016-09-12 17:06:55

标签: node.js migration associations sequelize.js sequelize-cli

我正在使用sequelize-cli进行迁移并研究了不同的场景,但似乎没有一个明确的答案如何自我加入。我希望有一个名为friendships的连接表,它连接用户和朋友(基本上只是用户)。

更具体地说,试图在这种情况下了解“通过”和“作为”之间的区别。

1)这是我的友谊表。在第二次协会上绊倒了。我创建了两列,一列是userId,另一列是friendId。我希望能够将此表链接到2个用户,每个表中有一个,其中一列别名为“friendId”。

```

'use strict';
module.exports = function(sequelize, DataTypes) {
  var friendship = sequelize.define('friendship', {
    userId: DataTypes.INTEGER,
    friendId: DataTypes.INTEGER
  }, {
    classMethods: {
      associate: function(models) {
        friendship.belongsTo(models.user);
        friendship.belongsTo(models.user { as: "friend" });
      }
    }
  });
  return friendship;
};

```

2)这是我的用户模型。再次,特别是在关联对象中,我不清楚。这里的目标是能够调用user.friends并显示该用户朋友的所有实例。我不确定我使用的是“通过”和“作为”关键字。

```

'use strict';
module.exports = function(sequelize, DataTypes) {
  var user = sequelize.define('user', {
    username: DataTypes.STRING,
    password: DataTypes.STRING,
    email: DataTypes.STRING
  }, {
    classMethods: {
      associate: function(models) {
        user.hasMany(models.friendship);
        user.hasMany(models.user { as: "friends", through: models.friendship });
      }
    }
  });
  return user;
};

```

1 个答案:

答案 0 :(得分:1)

存在多对多关系,它应该通过belongsToMany关联,不再需要关系。甚至没有必要定义好友表,sequelize会自动创建表

'use strict';
module.exports = function(sequelize, DataTypes) {
      var user = sequelize.define('user', {
        username: DataTypes.STRING,
        password: DataTypes.STRING,
        email: DataTypes.STRING
      }, {
        classMethods: {
          associate: function(models) {
            user.belongsToMany(models.user, {
               as: "friends", 
               through: "friendship", 
               foreignKey: "userId", 
               otherKey: "friendId"
            });
          }
        }
      });
      return user;
};