【问题标题】:Multiple foreign keys on sequelize (one-to-many or many-to-many)?续集上的多个外键(一对多或多对多)?
【发布时间】:2015-08-20 22:06:53
【问题描述】:

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

我的模型是这样定义的:

提醒

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

【问题讨论】:

    标签: javascript mysql node.js express sequelize.js


    【解决方案1】:

    UserAlert 之间存在“多对多”关系:

    • User 可以投票零个或多个Alerts
    • Alert 可以被零个或多个Users 投票

    此外,该关系具有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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-17
      • 2019-05-20
      • 1970-01-01
      • 2015-05-16
      • 1970-01-01
      • 1970-01-01
      • 2020-12-30
      相关资源
      最近更新 更多