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

标签 javascript mysql node.js express sequelize.js

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

我的模型是这样定义的:

提醒

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 之间存在“多对多”关系:

  • 一个用户可以投票给零个或多个Alert
  • 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来自官方文档。

关于javascript - sequelize 上的多个外键(一对多或多对多)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32129214/

相关文章:

javascript - knex 中的排水管连接需要比预期更多的时间

javascript - Sequelize findOne include 给出空数组

node.js - 生成器角度全栈 : how to run just the Server

javascript - 无法获取文本框的值并将 i 放入 JavaScript 中的变量中

javascript - 在 FullCalendar 的 Dayclick 事件上触发 jQuery qTip,然后使用其中的按钮创建事件

mysql - 具有多行值的子查询选择

mysql - 无事件状态的 SQL 查询

javascript - jQuery Validation 插件远程规则更改 php 函数值

javascript - 组件级别的 Angular 2 RC5 提供程序每次都会获取新实例

php - 如何在 Laravel 中建立 belongsTo() 关系?