在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`;
答案 0 :(得分:3)
在GitHub上回答你需要反转你的关联。 对于你的架构Rock belongsTo RockMode,它没有一个,因为foreignKey在Rock上。