外键指向错误的标识符

时间:2014-01-30 23:19:55

标签: node.js sequelize.js

在Sequelize中使用关联时,我遇到了一个特殊的问题。

我有两个型号

摇滚

rock_id         : { type: DataTypes.BIGINT, allowNull: false, primaryKey: true, autoIncrement: true },
rock_mode_id    : { type: DataTypes.BIGINT },

与协会:

associate: function(models) {
                    rock.hasOne(models.rock_mode, {foreignKey: "rock_mode_id"})
}

摇滚模式

rock_mode_id    : { type: DataTypes.BIGINT, allowNull: false, primaryKey: true },
rock_mode       : { type: DataTypes.STRING }

带有关联:

associate: function(models) {             
    rock_mode.belongsTo(models.rock, {foreignKey: "rock_mode_id", foreignKeyConstraint:false })
}

我试图用RockMode打印Rock但它似乎指向了错误的id

以下是渲染的代码(在rockString中):

db.rock
    .findAll({include: [db.rock_mode]})
    .success(
        function(rocks) {
            rockString += "<h2>Rocks</h2>"
            rocks.forEach(function(rock) {
                rock.getRockModeName(function(rockModeName){
                    rockString += JSON.stringify(rock)
                    callback(rockString);
                })

            })

    })

当我看到输出时:

{"rock_id":1,"rock_mode_id":1,"rock_mode":{"rock_mode_id":1,"rock_mode":"a"}}
{"rock_id":2,"rock_mode_id":1,"rock_mode":{"rock_mode_id":2,"rock_mode":"b"}}
{"rock_id":3,"rock_mode_id":1,"rock_mode":null}
{"rock_id":4,"rock_mode_id":1,"rock_mode":null}
{"rock_id":11,"rock_mode_id":1,"rock_mode":null}

似乎"rock_mode_id"的{​​{1}}引用了"rock_mode"而不是"rock_id"。有谁知道为什么?我的"rock_mode_id"hasOne是否存在问题?或者我应该在include中指定belongsTo吗?

编辑: 编辑: 它指向错误的id,这是生成的SQL

where

问题在于:

Executing (default): SELECT `rocks`.*, `rock_mode`.`rock_mode_id` AS `rock_mode.rock_mode_id`, `rock_mode`.`rock_mode` AS `rock_mode.rock_mode` FROM `rocks` LEFT OUTER JOIN `rock_modes` AS `rock_mode` ON `rocks`.`rock_id` = `rock_mode`.`rock_mode_id`;

这应该说

LEFT OUTER JOIN `rock_modes` AS `rock_mode` ON `rocks`.`rock_id`=`rock_mode`.`rock_mode_id`;

1 个答案:

答案 0 :(得分:3)

在GitHub上回答你需要反转你的关联。 对于你的架构Rock belongsTo RockMode,它没有一个,因为foreignKey在Rock上。