sequelize 上的多个外键(一对多或多对多)?

Multiple foreign keys on sequelize (one-to-many or many-to-many)?

我有两个表:用户和警报。用户应该能够对警报投赞成票和反对票。

我的模型是这样定义的:

警报

module.exports = function(sequelize, DataTypes) {
    var Alert = sequelize.define("alert", {
        ID: { type: DataTypes.BIGINT(11).UNSIGNED, primaryKey: true, autoIncrement: true },
        title: DataTypes.STRING,
        alert_type: DataTypes.INTEGER
    },
    {
        classMethods: {
            associate: function(models) {
                Alert.belongsTo(models.user, {
                    onDelete: "CASCADE",
                    foreignKey: {
                        allowNull: false
                    }
                });
            }
        }
    });
    return Alert;
};

用户

module.exports = function(sequelize, DataTypes) {
    var User = sequelize.define("user", {
        ID: { type: DataTypes.BIGINT(11).UNSIGNED, primaryKey: true, autoIncrement: true },
        user_login: DataTypes.STRING(50),
        user_pass: DataTypes.STRING(50),
        user_email: DataTypes.STRING(50),
    },
    {
        classMethods: {
            associate: function(models) {
                User.hasMany(models.alert);
            }
        }
     });
     return User;
};

使用 sequelize.js 和 MySQL(InnoDB) 的方法是什么?

我应该使用 belongToMany() 吗? 像 :

module.exports = function(sequelize, DataTypes) {
    var AlertVote = sequelize.define("user_alert_vote", {
        ID: { type: DataTypes.BIGINT(11).UNSIGNED, primaryKey: true, autoIncrement: true },
        vote_up: DataTypes.INTEGER,
        vote_down: DataTypes.INTEGER
    },
    {
        classMethods: {
        //    belongToMany(models.alert, ...);
        //    belongToMany(models.user, ...);
        }
     });
     return AlertVote ;
};

这里有一个 UserAlert 之间的 'many-to-many' 关系:

  • A User 可以投零票或许多 Alerts
  • 一个 Alert 可以被零个或多个 User 投票

此外,该关系具有 upVotedownVote 的属性(我不会讨论您的设计以具有这两个属性,因为我不知道用例的详细信息).

因此,您需要在 UserAlert 上使用 .belongToMany()

缩写代码如下:

var User = sequelize.define('User', {})
var Alert = sequelize.define('Alert', {})
var AlertVote = sequelize.define('AlertVote', {
    upVote: DataTypes.INTEGER,
    downVote: DataTypes.INTEGER,
})
Alert.belongsToMany(User, {through: 'AlertVote'});
User.belongsToMany(Alert, {through: 'AlertVote'});

更多细节请参考官方文档Belongs-To-Many associations